آموزش کامل برقراری امنیت در برنامه نویسی PHP

دسته بندی: برنامه نویسی
زمان مطالعه: 22 دقیقه
۲۶ اردیبهشت ۱۳۹۹

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

Security - PHP - Hacker

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

چرا باید برنامه‌های ایمن بنویسیم؟

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

چگونه برنامه‌های ایمن بنویسیم؟

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

هرگز به داده‌های کاربر اعتماد نکنید.

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

برای جلوگیری کردن از این خطاها در نرم افزارهای شما باید داده‌هایی که از سمت کاربر می‌آید را احراز هویت کنید، مانند کنترل کردن طول کاراکتر، بررسی ساختار (برای مثال اگر یک ایمیل ارسال می‌شود بررسی کنید که درست همان ساختار ایمیل را داشته باشد)، از بین بردن تگ‌های HTML درون داده‌ها.

دردسر‌های رمز عبور (Password) ضعیف:

یکی از دردسرهایی که همیشه وجود داشته و دارد این است که در بعضی از اوقات ما و کاربران از رمز عبور (Password)های ضعیف خواسته یا ناخواسته استفاده می‌کنیم که همیشه خیلی زود حدس زده می‌شود و می‌توانند هم به ما و هم به کاربران آسیب بزنند. رمز عبور (Password)های ضعیف مانند 123456، password، iloveyou، football و ... که هکر‌ها می‌توانند با در نظر گرفتن لیستی از رمز عبور (Password)های ضعیف به سیستم شما وارد شوند.

مشکلاتی که می‌تواند رمز عبور (Password)های ضعیف برای ما ایجاد کنند دزدیده شدن اطلاعات، سوء استفاده کردن از اطلاعات، ویروسی کردن و ... است، برای مثال اگر رمز عبور (Password) شما را در یک وب‌ سایت به دست بیاورند می‌توانند با اطلاعات شما در همان سایت فعالیت‌های مشکوکی داشته باشند.

برنامه‌ نویسانی که وب‌ سایت‌ها را توسعه می‌دهند حتما حتما باید رمز عبوری (Password) که در سمت کاربر می‌آید را هش کنند و آن را به صورت خام درون پایگاه داده ذخیره سازی نکنند.

خصوصیات یک رمز عبور (Password) قوی:

یک رمز عبور (Password) قوی باید شامل اعداد، حروف بی‌ربط و کوچک و بزرگ، علامت‌ها مثل ! @ # $ & _ و طول بیشتر از 8 کلمه داشته باشد. باید همیشه از رمز عبور (Password)های یکنواخت بپرهیزیم، برای مثال رمز عبور (Password) زیر را بخوانید.

(chnvchnhnm_3455$%&(ENTBSABNTNKKB

بدون تردید هیچی از این رمز عبور (Password) را متوجه نشدید ولی این رمز عبور (Password) برای ما معنی دارد، بخش اول آن که chnvchnhnm بود، هر کاراکتر آن، کاراکتر اول کلمات شعر (چنین نماند و چنین نیز هم نخواهد ماند) بودند، چنین: ch، نماند: n، و: v، چنین: ch و ...، بعد از آن یک _ (Underscore) وجود دارد و چندین عدد و حروف و داخل پرانتز دوباره یک شعر با قوانین بالا نوشته‌ایم.(ای نام تو بهترین سر آغاز بی نام تو نامه کی کنم باز) شعر دوم ما در پرانتز است.

PHP - Security - Password - Hacker

مشکلات موجود در انکودینگ (Encoding):

در بعضی مواقع می‌توان در برخی از وب‌ سایت‌ها مشاهده کرد که یک سری از خروجی‌ها با ظاهری بسیار نامناسب مشاهده می‌شوند یا به اصطلاح خرچنگ قورباغه نمایش داده می‌شوند، دلیل نمایش خروجی‌ها به این شکل انکودینگ (Encoding) آن‌ها می‌باشد، مناسب‌ترین انکودینگ برای نمایش خروجی‌ها utf8 می‌باشد.

بروز بودن نسخه‌ی (Version) PHP:

بروز نگه داشتن نسخه‌ی (version) PHP از اهمیت بالایی برخوردار است چون به احتمال زیاد Version قبلی PHP یک سری باگ‌ها یا خطاهایی داشته است و با بروز کردن Version آن می‌توانیم از آسیب‌پذیری وب‌ سایت کم کنیم. تاکید بر بروز کردن نسخه‌ی PHP این است که باگ‌های Version قبلی در اختیار تمامی توسعه دهندگان قرار داده می‌شود تا سازمان یا افرادی که PHP کار می‌کنند اقدام به بروزرسانی آن کنند.

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

امنیت در cookie ها:

یکی دیگر از مباحث امنیت که باید آن را رعایت کنیم برقراری امنیت در کوکی‌هاست که باید از دزدیده شدن آن‌ها جلوگیری کنیم یا باید به نحوی عمل کنیم که اگر هم دزدیده شد به پروژه‌ی ما ضربه‌ای نزند.

اولین نکته: هرگز اطلاعات حساس را در کوکی‌ها ذخیره سازی نکنید، برای مثال آیدی کاربری خود را در کوکی‌ها ذخیره سازی نکنید چون کوکی‌ها قابل ویرایش هستند و می‌توان به راحتی اطلاعات کاربر را با آن‌ها دزدید.

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

سومین نکته: کوکی‌ها را از دسترس جاوا اسکریپت خارج کنید، برای این کار کافیست کد زیر را رعایت کنید.

 

setcookie(name, value, expire, path, domain, secure, httponly);

 

  • name: نام کوکی
  • value: مقدار کوکی
  • expire: تاریخ انقضای کوکی
  • path: که معمولا آن را با مقدار / جایگذاری می‌کنند تا در تمامی صفحات قابل دسترس باشد.
  • domain: نام دامنه
  • secure: که معمولا با مقدار false جای‌گذاری می‌کنند اگر true باشد فقط در پروتکل‌های https در دسترس می‌باشد.
  • httponly: با قرار دادن مقدار true می‌توانیم دسترسی جاوا اسکریپت را از کوکی‌ها ببندیم.

توجه داشته باشید که به ترتیب وارد کردن این مقادیر مهم است.

الگوریتم‌های کدگذاری یا هش کردن:

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

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

PHP - Security - Password - Hashing

تابع md5:

string md5 ($string, $getRawOutput)

در کد بالا تابع ()md5 دو ورودی دریافت می‌کند که پارامتر دوم آن به صورت دلخواه است. پارامتر اول رشته‌ای که باید هش بشود را دریافت می‌کند و در پارامتر دوم یک مقدار true یا false را می‌گیرد که به طور پیش فرض false است، اگر مقدار true را به تابع بدهیم خروجی آن به صورت باینری با طول 16 می‌باشد.

تابع sha1:

string sha1($string, $getRawOutput)

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

تابع hash:

string hash($algo, $string, $getRawOutput)

همان‌طور که در بالا هم آمده است تابع hash سه تا پارامتر دارد، اولین پارامتر آن الگوریتم هش کردن رشته دریافت می‌کند که به دوتا از معروف‌‌ترین آن‌ها در بالا اشاره کردیم (md5 - sha1)، پارامتر دوم رشته‌ای که باید هش بشود را می‌گیرد و پارامتر سوم که اختیاری است که بالاتر نیز اشاره شد دو مقدار true یا false را دریافت می‌کند و به طور پیش فرض false است و اگر مقدار true را وارد کنیم تابع به عنوان خروجی رشته‌ی هش شده باینری را به عنوان خروجی بر می‌گرداند.

تابع password_hash:

یکی از بهترین گزینه‌ها برای هش کردن رمز عبور (Password)ها می‌تواند تابع password_hash باشد، مزیتی که باعث شده این تابع فعلا یکی از بهترین گزینه‌ها باشد این است که هر بار یک هش تصادفی (Random) به عنوان خروجی برمی‌گرداند که این موضوع می‌تواند از کرک کردن رمز عبور (Password)ها جلوگیری کند.

 string password_hash ( $password , $algo [, array $options ] )

پارامتر اول رمز عبور (Password)ی که باید هش بشود را دریافت می‌کند، پارامتر دوم الگوریتمی که این رمز عبور (Password) را هش می‌کند را دریافت می‌کند و دارای چهار گزینه است.

  • PASSWORD_DEFAULT
  • PASSWORD_BCRYPT
  • PASSWORD_ARGON2I
  • PASSWORD_ARGON2ID

وارد کردن پارامتر سوم نیز واجب نیست ولی می‌توانید به صورت آرایه به آن مقدار بدهید، برای مثال:

string password_hash ( "7learn" , PASSWORD_DEFAULT , ['cost' => 12 ] );

با قرار دادن cost و مقداردهی به آن به تابع وقت داده‌ایم که بیشتر روی هش کردن رمز عبور (Password) وقت بگذارد و اگر این مقدار افزایش پیدا کند  برای هش کردن چندین ثانیه زمان می‌برد.

اما مهم‌تر از آن Verify یا تایید کردن رمز عبور (Password) می‌باشد چون هر بار یک هش تصادفی به ما برمی‌گرداند شاید برای ما سوال باشد که چگونه رمز عبور (Password) را Verify کنیم؟

 bool password_verify ( $password , $hash )

با تابع password_verify می‌توانیم فرآیند تایید کردن را انجام دهیم. این تابع دو پارامتر را دریافت می‌کند که اولی رمز عبور (Password)ی است که از کاربر می‌گیریم و دومی رمز عبور (Password) هش شده‌ای است که در پایگاه داده ذخیره کرده‌ایم، اگر رمز عبور (Password) و هش مطابقت داشته باشد مقدار true را برمی‌گرداند و اگر نداشته باشد مقدار false را  برمی‌گرداند.

مشکلات ناشی از register_globals:

register_globals یک تنظیمات درون PHP است که اگر فعال باشد مقادیری که از آرایه‌های سوپر گلوبال (Superglobals) می‌آیند را با نام‌های آن‌ها متغیر می‌سازد و مقادیرشان را درون همان متغیرها می‌ریزد. برای مثال:

 

$username === $_POST['username'];

 

در مثال بالا متغیر username همان مقدار username است که از آرایه سوپر گلوبال(Superglobals) POST آمده است.

غیر فعال کردن register_globals در cpanel:

ابتدا باید وارد  سی‌پنل خود بشوید و در تب Software گزینه Select PHP Version را بزنید.

Cpanel - register_globals - PHP

در پنجره‌ی باز شده گزینه‌ی Switch To PHP Version را بزنید تا به صفحه‌ی غیر فعال سازی register_globals منتقل بشویم.

Cpanel -register_globals - PHP

در صفحه‌ی مورد نظر شما می‌توانید register_globals را on یا off کنید که باید گزینه off را انتخاب کنید، بعد از انتخاب گزینه بر روی دکمه‌ی Save بزنید تا تغییرات برای شما ذخیره شوند.

Cpanel - register_globals - PHP

غیر فعال کردن register_globals در localhost:

شما اگر در سیستم XAMPP دارید روی گزینه config در Apache بزنید و روی php.ini کلیک کنید تا فایل notepad آن باز شود، با زدن کلیک ترکیبی CTRL + F کلمه register_globals را جستجو کنید و اگر مقدار روبه‌روی آن on بود به off تغییر دهید.

اگر در سیستم WAMP نصب کرده‌اید روی WAMP کلیک کنید و روی گرینه PHP بروید و بعد بر گزینه php.ini کلیک کنید و با زدن کلیک ترکیبی CTRL + F کلمه register_globals را جستجو کنید و اگر مقدار روبه‌روی آن on بود به off تغییر دهید.

استفاده از فریم ورک‌ها به جای PHP Pure:

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

در چندین سال قبل وقتی قصد داشتیم که یک فریم‌ورک از PHP را شروع به کار کنیم سر دو راهی می‌ماندیم که کدام یک را انتخاب کنیم، مثل Laravel، Sympony، Yii، CakePHP و ... اما در این چند سال یکی از قطعی‌ترین انتخاب‌های برنامه‌ نویسان PHP لاراول است، چون در این چند سال بهترین عملکرد را داشته است، البته ما نمی‌توانیم افراد را مجبور به کار کردن با فریم‌ورک لاراول کنیم چون ممکن است فردی دلیل دیگری برای استفاده از فریم‌ورک دیگری داشته باشد یا اصلا ممکن است دلیلی برای استفاده از PHP Pure داشته باشد، ولی فریم‌ورک‌ها باعث شده‌اند که ما فقط بر روی توسعه دادن کد‌ها و پروژه تمرکز کنیم و هیچ نگرانی در امنیت یا مسائلی دیگر نداشته باشیم.

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

 

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

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

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

برای افزایش امنیت در php پسوند فایل‌هایی که قرار است لود بشود را 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 شدید کلیدهای ترکیبی 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 به آن‌ها اشاره شده است از اهمیت بسیار بالایی برخوردار هستند که باید آن‌ها را در پروژه‌هایمان رعایت کنیم، اگر کوچک‌ترین اشتباهی در کار باشد می‌تواند برای ما و کاربران بسیار مشکل ساز باشد، توصیه ما و خیلی از توسعه دهندگان این است که امنیت را در پروژه‌های خود جدی بگیرید و نادیده گرفتن آن می‌تواند فاجعه به پا کند چرا که این اطلاعات اهمیت زیادی دارد، ممکن است کاربران‌ با همان نام‌ کاربری و رمز عبور (Password) در خیلی از وب‌ سایت‌های دیگر نام‌نویسی کرده باشند و به راحتی فرد سودجو به تمام آن‌ها دسترسی داشته باشد. اگر با PHP Pure کار می‌کنید که باید با حساسیت زیادی پروژه خود را جلو ببرید ولی اگر از فریم‌ورک‌ها (Framework) استفاده می‌کنید که این مسائل برای شما حل شده است و دغدغه‌ای نسبت به آن ندارید، به یاد داشته باشید که هکرها از اشتباهات شما علیه خودتان استفاده می‌کنند پس کمتر اشتباه کردن باعث حفظ پروژه‌هایتان می‌شود.

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

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

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

هادی لطفی

خیلی عالی بود دستت درد نکنه .. همینطور پر انرژی ادامه بده✔

امیر صالحی

خواهش میکنم، مرسی که وقت واسه خوندنش گذاشتی

Muhammad Haris

سلام
مقاله بسیار عالی امید که مقالات جهت بالابردن امنیت ویب سایت ها بیشتر نشر کنید
تشکر

امیر صالحی

سلام، خوش حالیم که براتون مفید بوده. چشم حتما بررسی میشه

امیر اسماعیلی

واقعا مقاله کامل و خوبی بود
ایول 👍

امیر صالحی

خواهش میکنم

حسین زاهدی ادیب

خیلی خوب بود. تعداد زیادی از مشکلات و باگ ها رو معرفی کردید و راهکار های پیشنهادی برای رفع آنها را هم نوشتید.
خیلی ممنون، مورد استفاده قرار گرفت.

امیر صالحی

ممنون از وقتی که برای این مقاله گذاشتید، خوشحالیم که مورد استفاده شما قرار گرفت

محمد حارث محمدی

سپاس فراوان از زحمات شما جهت نشر مطالب مفید , منتظر مقاله های جدید!
تشکر یک جهان (:

امیر صالحی

سپاس از شما برای وقتی که گذاشتید

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