امنیت پی اچ پی PHP

الزامات و روش های موثر در بهبود امنیت پی اچ پی (PHP)

انتشار محتوای سایت ایران سایبر فقط با ذکر منبع رسمی مجاز است 

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

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

در این مقاله ۱۰ مرحله برتر که همه مالکان وب سایت ها باید برای امن نگه داشتن وب سایت پی اچ پی php خود در نظر داشته باشند را گردآوری کرده ام :

  1. PHP Sessions Security – (امنیت جلسات پی اچ پی)

  2. Disable Display Errors – (غیر فعال کردن خطاهای نمایش)

  3. Restrict File Uploads – (محدود کردن آپلود فایل)

  4. Disable sensitive functions in PHP – (غیر فعال کردن توابع حساس در پی اچ پی)

  5. Disable allow_url_fopen ( غیر فعال کردن allow_url_fopen )

  6. Disable magic_quotes  ( غیر فعال کردن magic_quotes )

  7. Disable register_globals  ( غیر فعال کردن register_globals )

  8. Disable use_trans_sid ( غیر فعال کردن use_trans_sid )

  9. Make use of correct php.ini file  ( استفاده صحیح از فایل php.ini )

  10. “Analyse PHP Setting using “PhpSecInfo ( تجزیه و تحلیل تنظیمات پی اچ پی با استفاده از 

    PhpSecInfo )

PHP Sessions Security  – (امنیت جلسات پی اچ پی)

برای حفظ امنیت جلسات باید موارد زیر را انجام دهید:

  • هنگام تأیید اعتبار از کاربران یا انجام عملیات حساس از SSL استفاده کنید. (از sslforfree.com برای گواهی https رایگان استفاده کنید)

  • هر بار که سطح امنیتی تغییر می کند (مثل ورود به سیستم)، شناسه جلسه را دوباره احیا کنید. حتی می توانید با استفاده از دستور session_regenerate_id شناسه جلسه هر درخواست را بازسازی کنید.

  • زمان جلسات باید خارج از فاصله زمانی ثابت باشد.

  • از register_globals استفاده نکنید

  • جزئیات تأیید اعتبار فروشگاه را روی سرور ذخیره کنید. به این معنا که، جزئیاتی مانند نام کاربری را در کوکی ارسال نکنید.

  • $_[‘SERVER[‘HTTP_USER_AGENT را بررسی کنید . چرا که این یک مانع کوچک برای ربودن جلسه است. یا همچنین می توانید آدرس IP را بررسی کنید. اما این امر می تواند موجب مشکلاتی برای کاربران که به دلیل متعادل سازی بار در اتصالات اینترنتی متعدد و غیره … آدرس آی پی را تغییر داده اند گردد (که در محیط ما در اینجا آمده است).

  • دسترسی به جلسات در سیستم فایل را محدود کرده یا از جلسه سفارشی استفاده کنید.

  • برای عملیات های حساس، ورود به سیستم کاربران ملزم به ارائه جزئیات احراز هویت دوباره باشد.

علاوه بر این دو حمله عمده برای جلسات وجود دارد:

  • Session fixation Attacks

با استفاده از ()session_regenerate_id میتوان مانع این جمله شد.

  • Session Hijacking

این حمله می تواند از طریق رمزگذاری داده ها با استفاده از گواهینامه SSL جلوگیری شود.

علاوه بر این، دو گزینه مهم دیگر که نیاز به تغییر در Session دارند، عبارتند از:

  • cookie_httponly باید به ۱ تنظیم شود.

این به مرورگر کاربر می گوید که این کوکی برای جاوا اسکریپت در دسترس نیست، که آسیب یک حمله اسکریپت متقابل سایت را محدود می کند.

  • cookie_secure باید به ۱ تنظیم شود.

این به مرورگر کاربر می گوید که کوکی ها را به طور کامل ارسال نمی کند، مگر اینکه بیش از HTTPS باشد.

Disable Display Errors  – (غیر فعال کردن خطاهای نمایش)

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

این مقاله نحوه غیر فعال کردن display_errors با ویرایش فایل PHP.ini را پوشش می دهد و همچنین نحوه تنظیم تنظیمات گزارش خطا، پیکربندی خطا در ورود به سیستم و استفاده از عملکرد ()ini_set برای کمک به رفع خطاهای PHP در وب سایت شما را پوشش می دهد.

در حالی که وب سایت شما فعال است، فایل php.ini باید به دلایل امنیتی، display_errors را غیرفعال کند.

دستور display_errors تعیین می کند که پیام های خطا باید به مرورگر ارسال شوند. این پیامها اغلب حاوی اطلاعات حساس در مورد محیط برنامه وب شما هستند و همیشه باید غیرفعال شوند.

این دستورالعمل باید در فایل ini در PHP قرار گیرد. این فرآیند تمام اشتباهات شامل نحوه یا خطاهای تجزیه را نشان می دهد که نمی تواند نمایش داده شود فقط با فراخوانی عملکرد ini_set در کد PHP. فایل PHP ini را می توان در خروجی نمایش داده شده تابع ()phpinfo پیدا کرد که به عنوان فایل پیکربندی لود شده است. اگر برنامه وب در حال تولید است، این دستورالعمل در پیکربندی ini باید غیر فعال شود.

فایل php.ini را باز کنید و گزینه های زیر را تنظیم کنید:

display_errors = Off

log_errors = On

به طور خلاصه، این پیکربندی می تواند در httpd.conf آپاچی یا فایل .htaccess غیر فعال شود تا همه خطاهای PHP را متوقف کند:

php_flag display_errors Off

php_flag log_errors On

توجه: display_errors باید غیرفعال شود و تمام پیام های خطا که به فایل های سیستم وارد شده با استفاده از دستور log_errors منتقل شوند بنابراین این دستور باید فعال باشد.

به طور پیش فرض تمام خطاها بر روی error_log رایت شده است که به dev / null/ تنظیم شده است. این به این معنی است که ورود به سیستم خطا رخ نخواهد داد. وقتی خطاها فعال می شوند، خطاهایی که در یک پرونده در دایرکتوری خطا رخ می دهد ذخیره می شود.

در مواردی که می خواهید ارور ها را  بر روی سایت نمایش ندهید و می خواهید خطاهای یک صفحه را بررسی کنید،

می توانید از تابع ini_set() برای نمایش خطاهای داده شده در یک صفحه خاص استفاده کنید. سینتکس پایه از php.net، عملکرد را نشان می دهد و پارامترهای آن به شرح زیر است که می تواند در بالای صفحه PHP شما با متغیر error_reporting در آن قرار گیرد:

string ini_set ( string $varname , string $newvalue )

ini_set(‘display_errors’, ‘۱’);

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

php security

Restrict File Uploads  – (محدود کردن آپلود فایل)

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

برای غیرفعال کردن این فرآیند، فایل php.ini را ویرایش کنید و دستور زیر را به فایل_uploads بفرستید:

file_uploads = off

در صورت استفاده از کنترل آپلود فایل، اطمینان حاصل کنید که دایرکتوری موقت پیش فرض مورد استفاده برای آپلود فایل را تغییر داده اید. در اینجا به راحتی می توانید با ویرایش یک فایل مشابه این تغییر را اعمال کنید:

upload_tmp_dir = /var/php_tmp

همچنین می توانید اندازه فایل ها را با تنظیم کنترل زیر محدود کنید:

upload_max_filesize = 10M

برای اطمینان از این که آپلود فایل به درستی کار می کند، دستور directive post_max_size باید کمی بزرگتر از upload_max_filesize باشد. برای مثال، تنظیمات زیر نشان می دهد که چگونه محدودیت آپلود فایل را به ۱۰ مگابایت تنظیم کنید:

upload_max_filesize = 10M

post_max_size = 16M

پس از اصلاح فایل php.ini، باید سرور آپاچی خود را با تایپ دستور “service apache2 restart” راه اندازی مجدد کنید.

Disable sensitive functions in PHP  – (غیر فعال کردن توابع حساس در پی اچ پی)

زبان PHP دارای توابع بسیار زیادی است که اگر آنها به درستی پیکربندی نشوند می توانند مورد سوء استفاده هکرها قرار بگیرند. چند توابع خطرناک ()exec ()، passthru ()، shell_exec  و غیره هستند که شما به راحتی می توانید با ویرایش فایل php.ini با دستور disable_functions غیرفعال کنید.

این دستورالعمل disable_functions به شما اجازه می دهد تا به دلایل امنیتی، توابع خاصی را غیرفعال کنید.

برای انجام این کار، فایل php.ini را با هر ویرایشگر متن مانند Notepad + +، Vim (اگر دستگاه لینوکس باشد) باز کنید و لیست جدید را به صورت زیر تنظیم کنید:

disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source

بعد از ذخیره php.ini، سرور Apache را با تایپ کردن service apache2 restart (اگر سرور لینوکس است) راه اندازی مجدد کنید.

غیر فعال کردن allow_url_fopen  

این دستورالعمل به توابع فایل پی اچ پی اجازه می دهد داده ها را از مکان های راه دور، مانند FTP یا HTTP بازیابی کند.

اگر مهاجم بتواند argument هایی را برای این توابع دستکاری کند، می تواند از یک URL تحت کنترل خود به عنوان آرگومان استفاده کند و اسکریپت های راه دور خود را به نام “فایل فشرده (Remote File” (RFI اجرا کند.

این دستور باعث می شود توابعی مانند ()include  و ()require برای بارگیری و اجرای کد از URL های از راه دور عمل کنند که سایت شما را در معرض خطر بالا قرار می دهد.

برای غیر فعال کردن این دستورالعمل، با ویرایش فایل php.ini، عملکرد زیر را غیر فعال کنید:

allow_url_fopen = Off

با echo file_get_contents($_POST[‘url’]); function یک نفوذگر می تواند به راحتی یک مسیر فایل را به جای یک URL عبور داده و به فایل های سرور شما دسترسی پیدا کند.

همان تنظیمات را می توان در فایل httpd.conf آپاچی نیز استفاده کرد:

php_admin_flag allow_url_fopen Off

تعداد زیادی از آسیب پذیری های تزریق کد در برنامه های وب PHP گزارش شده است که توسط enable_url_fopen فعال و فیلتر ورودی نامناسب ایجاد می شود. شما باید همیشه این دستورالعمل را به دلایل امنیتی غیرفعال کنید.

غیر فعال کردن magic_quotes  

این دستورالعمل فقط می تواند در سطح سیستمی غیر فعال شود. گزینه magic_quotes_gpc جهت محافظت از سرور ها از حملات تزریق SQL کارایی دارد. این فرآیند به طور موثر ()addslashes را بر روی تمام اطلاعات دریافت شده بر روی GET، POST یا COOKIE اجرا می کند.

به عنوان مثال، اگر یک کاربر “hello ICG” (با علامت نقل قول) را در یک فرم HTML بنویسد، PHP به طور خودکار علامت نقل قول را فراموش می کند و مقدار را به عنوان \”hello ICG\” ذخیره می کند.

برای غیرفعال کردن این گزینه:

magic_quotes_gpc = Off

همان تنظیم را می توان در httpd.conf یا فایل htaccess آپاچی نیز استفاده کرد:

php_flag magic_quotes_gpc Off

در صورتی که در حال دریافت  خطای سرور داخلی (۵۰۰) هستید، باید تنظیمات بالا را در شروع فایل php قرار دهید:

ini_set (‘magic_quotes_gpc’, ۱);

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

<?php phpinfo(); ?>

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

دستور register_globals به طور پیش فرض غیر فعال است. شما باید از پیامدهای امنیتی فعال کردن دستور register_globals مطلع شوید.

توجه: این ویژگی از PHP 5.3.0  شروع شده و از PHP 5.4.0 حذف شده است.

register_globals یک تنظیمات داخلی PHP است که عناصر آرایه $ _REQUEST را به عنوان متغیر ثبت می کند. اگر یک مقدار را در یک فرم از طریق POST یا GET ارسال کنید، مقدار آن ورودی به طور خودکار از طریق متغیر در اسکریپت PHP قابل دسترسی است، که به نام فیلد ورودی نامگذاری شده است.

برای غیر فعال کردن این دستورالعمل، فایل php.ini را ویرایش کنید و دستور زیر را بر روی Off تنظیم کنید.

register_globals = Off

برای وب سرور آپاچی، از دستور php_flag در یک فایل htaccess استفاده کنید تا رجیستر globals را در یک درخت بر اساس هر یک از شاخه ها غیرفعال کنید.

php_flag register_globals Off

اگر از PHP به عنوان یک ماژول Apache استفاده می کنید، می توانید دستور زیر را در یک فایل .htaccess (یا httpd.conf) قرار دهید، محدود به فایل یا فایل هایی که می خواهید:

<FilesMatch “^foo\.php$”>
php_flag register_globals Off
</FilesMatch>

غیر فعال کردن use_trans_sid

هنگامی که use_trans_sid فعال می شود، پی اچ پی می تواند session ID را از طریق URL عبور دهد. این فرآیند باعث می شود که برنامه برای حملات ربودن جلسات آسیب پذیر باشد.

ربودن جلسه اساسا یک شکل از سرقت هویت است که در آن یک هکر با دزدیدن شناسه جلسه یک کاربر مشروع آن را جعل می کند. وقتی نشانه جلسه در یک کوکی منتقل می شود و درخواست بر روی یک کانال امن (یعنی استفاده از SSL) ساخته می شود، این نشانه امن بودن است.

موارد زیر باعث می شود که کاربران آسیب پذیر باشند و جلساتشان توسط هر کسی که ممکن است ربوده شود:

  • URL را روی shoulder کاربر مشاهده کنید

  • URL توسط کاربر ارسال می شود

  • URL را از تاریخ مرورگر بازیابی کنید

شما می توانید به راحتی این گزینه را با ویرایش فایل php.ini یا فایل .htaccess غیر فعال کنید، همانطور که در زیر نشان داده شده است:

با فایل php.ini –

session.use_trans_sid = ‘off’

با فایل .htaccess

php_flag session.use_trans_sid off

استفاده صحیح از فایل php.ini

راه اندازی یک فایل php.ini یک فرایند نسبتا ساده و آسان است. به طور خلاصه، فایل php.ini به شما اجازه می دهد تنظیمات مربوط به سرور را به طور خاص برای حساب کاربری خود سفارشی کنید. و همچنین می توانید بسیاری از موارد را با فایل php.ini مانند افزایش حداکثر اندازه آپلود فایل یا افزایش میزان اجرای حافظه و غیره انجام دهید.

اما اطمینان حاصل کنید که قبل از هر گونه تغییری در آن بایستی یک نسخه پشتیبان از فایل php.ini را تهیه کنید. در صورتی که قبلا آن را خراب کردید، می توانید فایل پیش فرض php.ini را از لینک زیر دانلود کنید:

سریع ترین راه برای پیدا کردن مسیر php.ini در این است که از دستور locate استفاده کنید اما همانگونه که گفته شد، معمولا فایل های php.ini در داخل یک سرور وجود دارد و مسیر فایل را باید به خاطر بسپارید .

مسیر مطلق فایل در سرورهای لینوکسی php.ini خواهد بود:

/etc/php5/apache2/php.ini

راه دیگری برای پیدا کردن فایل php.ini این است که از تابع پی اچ پی PHPInfo() برای پیدا کردن پیکربندی php.ini در حال خواندن استفاده کنید.

علاوه بر این می توانید از ویژگی grep برای قرار دادن فایل php.ini به عنوان دستور زیر استفاده کنید:

Command: php -i |grep php.ini

هر PHP دارای دو مجموعه php.ini یعنی php.ini-production و php.ini-development است.

در مورد توابع زیر برای هر دو مجموعه php.ini مراقب باشید:

  • short_open_tag
  • disable_functions
  • memory_limit
  • gc_probability
  • display_startup_errors
  • track_errors
  • error_reporting

تجزیه و تحلیل تنظیمات پی اچ پی با استفاده از PhpSecInfo

PhpSecInfo معادل تابع phpinfo() را فراهم می کند که اطلاعات امنیتی در مورد محیط PHP را گزارش می دهد و پیشنهاداتی را برای بهبود ارائه می دهد. این یک جایگزین برای تکنیک های توسعه امن نیست و هیچ نوع کد یا برنامه حسابرسی را انجام نمی دهد بلکه می تواند یک ابزار مفید در رویکرد امنیتی چند لایه باشد.

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

 

 

گردآورنده : سید محمد اسماعیلی

 

نوشته های مرتبط

مدیریت دستگاه های IOT

۰۵

آبان
همه موضوعات

مدیریت از راه دور دستگاه های IOT با استفاده از ابزار Upswift

انتشار محتوای سایت ایران سایبر فقط با ذکر منبع رسمی مجاز است اگر فقط از یک دستگاه IoT استفاده می کنید و درحال توسعه پروژه های خود هستید، به روزرسانی و مدیریت آن سریع و آسان است. اما اگر ۱۰ ، ۵۰ یا ۱۰۰ دستگاه داشته باشید چه می کنید؟ مدیریت همه آنها ناگهان به یک دردسر […]

رکوردهای DNS

۱۹

مهر
همه موضوعات

مدیریت رکوردهای DNS با DNStable

یافتن اطلاعات در مورد سوابق DNS فرآیندی است که متخصصان امنیتی با عملیات های خاصی انجام می دهند. این اطلاعات از چند طریق قابل دستیابی است که در این مقاله به آنها خواهیم پرداخت. مشکل این است که بیشتر ابزارها برای یافتن سوابق DNS به روز شده و استفاده از آنها دشوار است. بیشتر متخصصان با تجربه[…]