جشنواره نوروزی سون لرن

آموزش امنیت در PHP - قسمت دوم

دسته بندی: برنامه نویسی
زمان مطالعه: 11 دقیقه
۰۴ فروردین ۱۳۹۹

در قسمت قبلی از مقاله‌ی آموزش امنیت در PHP - قسمت اول به نکات امنیتی و اشتباهات رایج برنامه‌نویسان اشاره کردیم و از اهمیت آن‌ها و رعایتشان در پروژه‌ها گفتیم. در این قسمت از مقاله‌ی امنیت نیز قرار است به نکات بسیار مهمی اشاره کنیم تا با رعایت کردن این نکات آسیب‌پذیری نرم‌ افزار خود را کاهش دهیم.

آموزش امنیت در PHP

فهرست محتوای این مقاله

ساختار نامناسب برنامه برای لود کردن فایل ها:

در همه‌ی پروژه‌ها ما فایل‌هایی داریم که آن‌ها را لود یا include می‌کنیم تا بتوانیم از کدهای درون آن‌ها استفاده کنیم، بعضی اوقات مشاهده می‌شود که برنامه‌ نویسان از فایل‌هایی با پسوند inc. استفاده می‌کنند تا فایل‌های خود را لود کنند. در ظاهر شاید همه چیز خوب کار کند اما وقتی شما فایل لود شده را در مرورگر باز کنید تمامی کدهای درون آن نمایان می‌شود و عملا کدهای شما لو می‌رود.

پسوند فایل‌هایی که قرار است لود بشود را inc. نگذارید و با همان پسوند php. استفاده کنید تا زمانی که در آدرس بار (Address bar) مرورگر نیز فراخوانی می‌شودکدهای درون فایل لو نروند.

عدم تنظیم صحیح نحوه‌ی گزارش خطاها:

خطاها زمانی رخ می‌دهد که ما در کدهایمان یک خطای نوشتاری، فراخوانی یک تابع تعریف نشده و ... داشته باشیم و ما باید در نمایش درست این خطاها دقت داشته باشیم.

چگونه همه خطاها را نمایش دهیم؟

اگر شما خطایی را در صفحه مورد نظر خود نمی‌بینید باید error reporting را فعال کنید. برای فعال کردن باید کد PHP خود را ویرایش کنید و کد زیر را اضافه کنید.

<?php
error_reporting(E_ALL);
?>

همچنین می‌توانیم از دستور ini_set استفاده کنیم.

<?php
ini_set('error_reporting', E_ALL);
?>

 

ویرایش کردن فایل php.ini برای گزارش دادن خطاها:

اگر تا الان خطایی را مشاهده نکرده‌اید باید سراغ فایل php.ini برویم و شروع به ویرایش کردن آن کنیم. مراحل دسترسی به php.ini در آموزش امنیت در PHP - قسمت اول گفته شده است و می‌توانید از آن مقاله استفاده کنید.

بعد از اینکه وارد فایل php.ini شدید کلیدهای ترکیبی CTRL + F را فشار دهید تا بتوانید در فایل جستجو کنید، درون فایل به دنبال display_error بگردید و مقدار روبه‌روی آن را on بگذارید.

ویرایش فایل htaccess. برای گزارش دادن خطاها:

فایل htaccess. که تنظیمات مهم‌ترین فایل‌ها را انجام می‌دهد در پوشه public و یا در فایل‌های اصلی (root) پیدا می‌شود. نقطه‌ی (dot) قبل از آن به معنای مخفی بودن آن است.

فایل htaccess. را باز کنید و کدهای زیر را درون آن قرار دهید.

php_flag display_startup_errors on
php_flag display_errors on

اگر مقادیر بالا در فایل htaccess. از قبل وجود داشتند بنابراین مطمئن شوید تا on باشند.

دستورات مفید:

اگر می‌خواهید فقط fatal errorها و parse errorها نمایش داده شوند از کد زیر استفاده کنید.

<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE);
?>

شما می‌توانید هر چیزی که مد نظر دارید وارد کنید فقط توجه داشته باشید که آن‌ها را با «|» از هم جدا کنید.

برای حذف یک نوع خطای خاص از گزارش می‌توانید از کد زیر استفاده کنید.

<?php
error_reporting(E_ALL & ~E_NOTICE)
?>

در مثال بالا تمامی خطاها را به نمایش می‌گذارد به جزء خطاهای NOTICE.

برای جلوگیری از گزارش خطاها می‌توانید به تابع error_reporting مقدار صفر را به تابع به عنوان ورودی بدهید.

<?php
error_reporting(0);
?>

آموزش امنیت در PHP - SQL

انتخاب نوع و سایز مناسب بری ستون‌های جداول پایگاه داده:

از مواردی که در تعریف جداول و ستون‌های آن‌ها نادیده گرفته می‌شود نوع و سایز آن‌ها می‌باشد که نباید از کنار این مسائل بدون توجه گذر کرد.

هرگز اندازه‌ی یک فیلد (Field) را بزرگ‌تر از مقدار مناسب آن نگیرید، برای مثال فیلد سن را با طولی بیشتر از 3 یا 4 عدد نگیرید چون مسن‌ترین فردی که در این کره‌ خاکی زندگی می‌کند سنش 3 رقمی است و لازم نیست که ما فیلد سن را با طول 10 در نظر بگیریم.

در فیلدهایی همچون شماره موبایل یا کدملی هم باید رعایت شود، مخصوصا کدملی که باید نوع فیلد نیز با دقت تعریف شود، نوع فیلد کد ملی را رشته با طول 10 کاراکتر تعریف کنید، اگر نوع فیلد عدد باشدکدملی‌هایی که با صفر شروع می‌شود، صفرهای ابتدای آن خوانده نمی‌شود، چون این قانون در ریاضیات وجود دارد که صفرهای پشت عدد بی‌ارزش هستند.

مشکلات امنیتی مربوط به پایگاه داده و تزریق SQL - SQL Injection:

یکی از معروف‌ترین مشکلات امنیتی در سایت‌هایی که با PHP نوشته شده‌اند SQL Injection است و شاید اولین تست امنیت را با همین بگیرند و جالب اینجاست که همچنان این ایراد امنیتی در برخی از وب‌سایت‌ها دیده می‌شود.

چندین سال قبل که برنامه‌نویسان PHP از فریم‌ورک‌ها (Framework) زیاد استفاده نمی‌کرند و از Mysql API برای ارتباط با پایگاه‌داده استفاده می‌کردند رفع این ایراد امنیتی جزء دغدغه‌هایشان بود اما الان با وجود PDO در PHP می‌توان این مشکل امنیتی را به راحتی و با رعایت چندین نکته رفع کرد.

مشکل امنیتی SQL Injection چه زمان رخ می‌دهد؟

مشکل اصلی، استفاده کردن از تابع query در PDO است که کنترلی بر روی دستورات SQL که وارد می‌شود ندارد و فقط آن‌ها را اجرا می‌کند. برای مثال شما کد زیر را در یک input فرم که در صفحه‌ی HTML شما است وارد می‌کنید.

'; Delete FROM users --

و کوئری SQL شما به این شکل است.

$db->query("SELECT * FROM users WHERE username = '{$username}' ");

قطعه کد SQL که در بالا آورده‌ایم را وقتی به عنوان ورودی وارد کنیم و به جای متغیر username بنشیند تک کوتیشن و سمی‌کالمن ( ; ' ) که در اول کوئری (Query) وجود دارد باعث می‌شود که کوئری وارد شده در تابع query از کار بیفتد و به شکل زیر در می‌آید.

$db->query("SELECT * FROM users WHERE username = '{';

و کد SQL بعد از سمی‌کالمن (;) وجود دارد و دوتا - (dash) باعث می‌شود که " موجود در انتهای کوئری که در تابع query وجود دارد کامنت بشود. (وقتی از کامنت استفاده می‌کنیم مفسر زبان برنامه‌نویسی و یا زبان‌هایی مانند SQL آن خط مشخص شده را نادیده می‌گیرند.)

$db->query("SELECT * FROM users WHERE username = '{'; Delete FROM users -- ");

اگر این دستور اجرا بشود تمامی کاربرهای وب‌سایت شما را حذف می‌کند و می‌تواند فاجعه رخ دهد.

رفع مشکل امنیتی SQL Injection:

برای رفع این مشکل امنیتی کافیست از تابع prepare در PDO استفاده کنید تا ورودی‌ها را بررسی کند و داده‌ی خطرناکی وارد سیستم ما نشود.

$stmt = $db->prepare("SELECT * FROM users WHERE username = ? ");
$stmt->execute([$username,]);

درون تابع prepare ما به جای اینکه مقادیر ورودی را مستقیم وارد کنیم به جای آن‌ها از علامت ? استفاده می‌کنیم و در تابع execute مقادیر ورودی را در یک آرایه به تابع می‌دهیم.

آموزش امنیت در PHP - HACK

مشکلات در پیکربندی وب سرورها:

بعضی اوقات پیش می‌آید به دلیل پیکربندی نکردن درست سرورها و بی‌توجهی کردن به آن، مشکلات امنیتی به وجود می‌آید، برای مثال بعضی از وب‌سرورها از پورت (port) پیش فرض 22 استفاده می‌کنند که این پورت (port) اولویت اول هکرها می‌باشد و اگر پورت (port) وب‌سرور خود را عوض نکنید قطعا آسیب می‌بینید.

یکی دیگر از مشکلات امنیتی در پیکربندی وب سرورها باید انجام شود این است که وقتی سرور شما از یک یا چندین IP درخواست زیادی را در چند ثانیه دریافت کرد آن ارتباط را قطع کند، نکات بسیار زیادی در پیکربندی وب‌ سرورها وجود دارد که بحث مفصل خودش را دارد.

مشکلات مربوط به هاست‌های اشتراکی:

تصور کنید شما در یک آپارتمان زندگی می‌کنید که تعداد زیادی واحد دارد و شما در حال استفاده از لابی، آسانسور، پله و... به صورت مشترک هستید، حال تصور کنید که یک نفر ویروسی مانند کرونا را دارد، چه اتفاقی می‌افتد؟

اکثر افرادی که سایت‌هایشان آلوده به ویروس می‌شوند از هاست‌های اشتراکی استفاده می‌کنند، مشکل زمانی به وجود می‌آید که دسترسی اکثر هاست‌ها با یک FTP است و اگر FTP لو برود باعث می‌شود همه آسیب ببینند، زمانی که تصمیم گرفتید که از هاست‌های اشتراکی استفاده کنید حتما از شرکتی که قرار است هاست تهیه کنید تحقیق کنید و از امنیت آن اطمینان حاصل فرمایید.

محافظت از Directory list ها:

اگر از PHP Pure (بدون استفاده از هیچ فریم‌ورکی) استفاده می‌کنید شاید دیده باشید که وقتی یک url از پروژه‌تان را فراخوانی می‌کنید با تصویر زیر مواجه می‌شوید.

آموزش امنیت در PHP - htaccess

اگر این فایل‌ها و پوشه‌ها به دست افراد سودجو برسد می‌تواند آسیب‌ به پروژهایمان برساند، این مشکل در فریم‌ورک‌ها رفع شده است و شما هیچ نگرانی درباره‌ی این ایراد امنیتی ندارید ولی اگر از فریم‌ورک‌ها استفاده نمی‌کنید می‌توانید یه فایل htaccess. ایجاد کنید و کد زیر را درون آن استفاده کنید.

Options -Indexes

از این پس با استفاده از کد بالا وقتی شما یک url اشتباه را وارد کردید یا فایلی به اسم index.php نداشتید به شما خطای Access forbidden را می‌‌دهد.

استفاده کردن از https:

استفاده کردن از HTTPS یکی از ضرورت‌های وب‌سایت شماست چون باعث می‌شود یک کانال امن بین کاربرانتان و سایت شما ایجاد شود و از لو رفتن اطلاعات جلوگیری می‌کند چون تمامی اطلاعات رمزنگاری می‌شوند و کسی نمی‌تواند دسترسی به داده‌ها داشته باشد.

HTTPS بر روی وب‌‌سرور شما سوار می‌شود، گاهی اوقات بعضی از افراد فکر می‌کنند که با داشتن HTTPS دیگر وب‌سایتشان هک نمی‌شود که این تصور کاملا غلط است و HTTPS ربطی به هک شدن وب‌سایت‌ها ندارد و فقط می‌تواند تضمین کند که اطلاعات در یک کانال امن در حال تبادل هستند.

شناخت انواع حملات:

انواع مختلفی از حملات در سطح وب وجود دارد که اگر شانس با شما همراه نباشد ممکن است گرفتار یکی از آن‌ها بشوید که در این قسمت آموزش امنیت در php به بررسی برخی از آن‌ها می‌پردازیم.

حمله Dos و DDos:

DoS مخفف شده سه کلمه Denial-of-Service و به معنای خودداری از خدمات است، این حمله درخواست‌های زیادی به سمت سرور می‌فرستد تا خدمات‌دهی وب‌سایت هدف را از کار بیندازد و از دسترس خارج کند.

DDoS مخفف شده سه کلمه Distributed Denial-of-Service به معنای خودداری از خدمات اما به صورت توزیع شده است که درخواست‌های زیادی به سمت سرور ارسال می‌شود تا سرور را از دسترس خارج کند.

تفاوت بین DoS و DDoS این است که در حمله‌ی DoS شما از یک مبدا حمله می‌کنید ولی در حمله DDoS شما می‌توانید با شماری از سیستم‌های مبدا در نقاط مختلف دنیا به هدف حمله کنید.

حمله XSS:

XSS مخفف شده سه کلمه Cross-site Scripting است و به معنی تزریق کد می‌باشد. شاید بگویید که اصلا شبیه به مخفف شده این کلمات نمی‌باشد، باید بگوییم که حق با شماست چون مخفف کردن این سه کلمه معادل CSS می‌شود که با CSS طراحی وب اشتباه گرفته می‌شود به همین خاطر XSS را به عنوان مخفف این کلمات انتخاب کردند.

در واقع حمله XSS با جاوا اسکریپت (Javascript) انجام می‌شود که اگر وب‌سایتتان از امنیت کافی برخوردار نباشد می‌تواند به پایگاه داده شما کدهای مخرب تزریق کند و هنگامی که از پایگاه داده اطلاعات خوانده می‌شود موجب تخریت سیستم‌تان شود و یا می‌تواند به راحتی کوکی‌ها را بدزدد و یا حتی می‌تواند تمامی رفتارهای کاربران‌تان را رصد کند و به یک سایت دیگر ارسال کند تا آن‌ها را در اختیار داشته باشد.

رفع باگ XSS:

بعد از خواندن مقاله‌ی آموزش امنیت در php دیگر نگران باگ XSS نباشید!

رفع کردن باگ XSS خیلی ساده است و فقط لازم به رعایت چند نکته می‌باشد، هر جایی از وب‌سایت‌تان که از کاربر اطلاعاتی را دریافت می‌کنید و یا اطلاعاتی را فراخوانی می‌کنید از تابع ()htmlspecialchars استفاده کنید تا تگ‌های خطرناکی که ممکن است در اطلاعات کاربر وجود داشته باشد را خنثی کند تا هیچ تاثیرگذاری نداشته باشد.

آموزش امنیت در PHP - Attack - Hack

حملات CSRF و راهکار‌های مقابله با آن:

CSRF به اختصار رسیده‌ی سه کلمه Cross-Site Request Forgery است که به معنای درخواست‌های جعلی است، مشکل زمانی به وجود می‌آید که یک فرد سودجو توسط یک لینک جعلی که به یک شخص یا اشخاصی می‌فرستد تا با جلب نظر آن‌ها روی آن لینک کلیک کنند و به یک سایتی منتقل بشوند تا از محتویات آن استفاده کنند، شاید در ظاهر محتویات سایت هدف خیلی خوب باشد ولی در پس‌زمینه آن سایت اطلاعات شما برداشته می‌شود و می‌توانند اسکریپت‌های (Script) مختلفی اجرا کنند.

راهکار مقابله با CSRF:

در این قسمت از مقاله‌ی آموزش امنیت در php به راهکارهای مقابله با CSRF می‌پردازیم.

اول آنکه به هیچ عنوان برای ویرایش یا حذف یک چیزی در وب‌سایت‌تان از متد GET استفاده نکنید و همیشه عملیات را از طریق یک فرم و با متد POST به کار ببرید.

در فرم‌هایتان از یک Input که type آن hidden است استفاده کنید، در صفحه‌ی هدف که اطلاعات فرم به آن ارسال می‌شود

مجموعه‌ای از حروف بی‌ربط را با استفاده از توابع ()random_bytes و ()bin2hex تولید کنید و آن را درون یک SESSION ذخیره سازی کنید، سپس در صفحه‌ای که فرم شما درون آن قرار داشت SESSION ساخته شده را در Value همان فیلد hidden قرار دهید،

می‌توانید داده‌های خود را ارسال کنید و مقایسه کنید که CSRF ارسال شده از فرم با CSRF که در صفحه‌ی هدف تولید شده است مطابقت دارد یا خیر؟

آماده حمله هکر‌ها باشید:

هکرها همیشه به دنبال خطاهای وب‌سایت‌ها می‌باشند و همیشه قصد آسیب‌رسانی را دارند، اینکه شما تا حدی امنیت وب‌سایت خود را برقرار کرده‌ باشید و بگویید که دیگر کسی به وب‌سایت من حمله نمی‌کند یا مشکلی برایش پیش نمی‌آید کاملا در اشتباه هستید چون شما هرگز نمی‌توانید بگویید که بالاترین امنیت را دارید و یا از امن‌ترین زبان برنامه‌نویسی درحال استفاده هستید، پس همیشه برای برقراری امنیت وب‌سایت‌تان کوشا باشید.

جمع بندی:

تمامی نکاتی که در قسمت قبلی از مقاله‌ی آموزش امنیت در php و این قسمت از مقاله اشاره شده است از اهمیت بسیار بالایی برخوردار هستند که باید آن‌ها را در پروژه‌هایمان رعایت کنیم، اگر با PHP Pure کار می‌کنید که باید با حساسیت زیادی پروژه خود را جلو ببرید ولی اگر از فریم‌ورک‌ها (Framework) استفاده می‌کنید که این مسائل برای شما حل شده است و دغدغه‌ای نسبت به آن ندارید، به یاد داشته باشید که هکرها از اشتباهات شما علیه خودتان استفاده می‌کنند پس کمتر اشتباه کردن باعث حفظ پروژه‌هایتان می‌شود.

با شرکت در دوره‌ی آموزشی متخصص PHP در کمتر از یکسال به یک متخصص PHP تبدیل می‌شوی که آماده‌ی استخدام، دریافت پروژه، کسب درآمد و یادگیری مباحثی مثل لاراول هستی.

چه امتیازی به این مقاله می دید؟
نویسنده امیر صالحی
عاشق دنیای برنامه نویسی و چالش های بزرگش

نظرات کاربران

اولین دیدگاه این پست رو تو بنویس !

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :