اقدامات امنیتی مناسب در PHP | قسمت دوم

PHP از “پسوندهای پویا ” پشتیبانی می کند. به صورت پیش فرض ، RHEL  تمام ضمایم ماژولهایی که در دایرکتوری /etc/php.d/ یافت می شوند را لود می کند. برای فعال یا غیرفعال کردن یک ماژول خاص کافی است فایل پیکربندی مربوطه را در دایرکتوری /etc/php.d/ یافته و نام  ماژول مورد نظر را وارد کنید. همچنین می توانید فایل پیکربندی ماژول را حذف کنید یا تغییر نام دهید. برای اینکه PHP بهترین عملکرد و امنیت را داشته باشد ، بهتر است تنها ضمیمه های  مورد نیاز برنامه های سایتتان  را فعال کنید. مثلاً برای غیرفعال کردن فایل gd دستور زیر را بنویسید: اقدامات امنیتی | قسمت دوم

# cd /etc/php.d/
# mv gd.{ini,disable}
#
/sbin/service httpd restart

 

برای فعال کردن ماژول PHP با نام gd  دستور زیر را وارد کنید:

# mv gd.{disable,ini}
#
/sbin/service httpd restart

  1. تمام خطاهای PHP را ثبت کنید

پیغامهای خطای PHP را برای همه ی بازدیدکنندگان سایت به نمایش نگذارید. /etc/php.d/security.ini را ویرایش کنید و دستورالعمل زیر را بنویسید:

display_errors=Off

مطمئن شوید که تمام خطاهای PHP را در یک فایل ثبت کرده اید.

log_errors=On

error_log=/var/log/httpd/php_scripts_error.log

  1. اجازه ندهید فایلها آپلود شوند

 برای امنیت بیشتر ، با ویرایش  /etc/php.d/security.ini و  تنظیم دستور زیر امکان آپلود فایلها را محدود کنید:

file_uploads=Off

اگر کاربران برنامه ی شما نیاز به آپلود فایلی داشتند، با تنظیم دستور upload_max_filesize   حداکثر حجم فایل قابل آپلود قابل قبول توسط PHP را محدود کنید:

file_uploads=On

# user can only upload upto 1MB via php

upload_max_filesize=۱M

  1. امکان اجرای دستورات remote را خاموش کنید

اگر allow_url_fopen فعال باشد ، این امکان را به فایلهای عملکردی PHP نظیر file_get_contents() و دستورات زیر مجموعه و مورد نیاز آن  ، می دهد که اطلاعات را از جاهای دیگر ، مثلاً FTP یا سایتهای دیگر بازیابی کند.

گزینه ی  allow_url_fopen ، این امکان را به فایلهای عملکردی PHP نظیر file_get_contents() و دستورات زیر مجموعه و مورد نیاز آن  ، می دهد که  با استفاده از پروتکلهای ftp یا http  اطلاعات را از جاهای دیگر ، مثلاً FTP یا سایتهای دیگر بازیابی کند. برنامه نویسان اغلب این موضوع را فراموش        می کنند و  زمان انتقال  اطلاعات به دست آمده از سوی کاربران ،فیلتر  مناسب را برای  این فایلها اعمال نمی کنند، در نتیجه  این فایلها را در معرض حملات تزریق کد قرار می دهند. بسیاری از حملات تزریق کد که در برنامه های بر پایه ی PHP گزارش شده است ، به دلیل فعال بودن allow_url_fopen و فیلترگذاری نامناسب برای ورودی ها بوده است. /etc/php.d/security.ini را ویرایش کنید و دستورالعمل زیر را وارد کنید:

allow_url_fopen=Off

پیشنهاد می کنم که allow_url_include را هم برای امنیت بیشتر غیرفعال کنید:

allow_url_include=Off
  1. SQL Safe Mode را فعال کنید

با ویرایش /etc/php.d/security.ini دستور زیر را وارد کنید:

sql.safe_mode=On

در صورتی که    mysql_connect() و  mysql_pconnect() روشن باشند ، تمام شناسه هایی که به آنها ارسال می شوند را رد می کنند . توجه داشته باشید که ممکن است شما مجبور شوید که رمزهای  خود را تغییر دهید.  زمانی که sql.safe_mode فعال باشد ، هیچ فرد دیگری  قادر به کار با برنامه نیست و  همچنین هیچ برنامه ی Open source مثل WordPress  اجرا نمی شود.

پیشنهاد می کنم که magic_quotes_gpc را هم برای برنامه هایی که به عنوان فیلترینگ در PHP نسخه ی ۵٫۳ نصب شده اند ، خاموش کنید ، با این کار mysql_escape_string() بی اثر و ضعیف شده و بدین ترتیب عملکرد فیلترینگ نتیجه ی بهتری به دست می آورد :

magic_quotes_gpc=Off
  1. حجم پست ها را کنترل کنید

روش درخواست HTTP Post زمانی استفاده می شود که مشتری ( مرورگر یا کاربر) نیاز به ارسال اطلاعات به سرور Apache به عنوان بخشی از درخواست ، مثلاً  آپلود یک فایل یا ثبت یک فرم تکمیل شده دارد. ممکن است مهاجمین سعی در ارسال Post بسیار بزرگ برای مصرف بیش از حد منابع سایت شما داشته باشند. شما می توانید حداکثر اندازه ی درخواست Post که PHP پردازش می کند ، را محدود کنید. /etc/php.d/security.ini را ویرایش و دستورالعمل زیر را وارد کنید:

; Set a realistic value here

post_max_size=۱K

۱K حداکثر اندازه ی Post اطلاعات  مجاز در برنامه های PHP را تعیین می کند. این تنظیمات بر روی آپلود فایل نیز موثر است. برای آپلود فایلهای بزرگ ، این مقدار باید بیشتر از upload_max_filesize. باشد. توصیه می کنم شیوه های دسترسی که از سرور Apache استفاده می کنند را نیز محدود کنید. httpd.conf را ویرایش کنید و دستورالعمل زیر را برای DocumentRoot /var/www/html وارد کنید: اقدامات امنیتی | قسمت دوم

<directory /var/www/html>

    <limitExcept GET POST>

        Order allow,deny

    </limitExcept>

## Add rest of the config goes here… ##

</directory>

  1. DoS )

می توانید حداکثر زمان اجرای هر فرمان PHP را بر حسب ثانیه تعیین کنید. گزینه ی دیگر تعیین حداکثر زمان لازم برای تجزیه و تحلیل اطلاعات یک درخواست توسط فرمانهای PHP و میزان حداکثر حافظه ای است که این فرمانها مصرف می کنند. /etc/php.d/security.ini را ویرایش و دستورالعمل زیر را وارد کنید:

# set in seconds

max_execution_time =  ۳۰

max_input_time = ۳۰

memory_limit = ۴۰M

  1. سیستم حفاظتی پیشرفته ی Suhosin را برای PHP نصب کنید

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

  1. غیرفعال کردن عملکردهای خطرناکPHP

PHP عملکردهای بسیاری دارد که در صورت استفاده ی نادرست می توانند باعث کرک شدن سرور مجازی شما شوند. می توانید با استفاده از دستورالعمل غیرفعال کردن عملکردها لیستی از عملکردها را در  /etc/php.d/security.ini تعیین کنید. اقدامات امنیتی | قسمت دوم

disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
  1.  دستورالعمل PHP Fastcgi / CGI – cgi.force_redirect

PHP که با Fastcgi / CGI کار می کند ، با اینکه فضای حافظه ی سرور شما را کاهش می دهد ، اما باز هم سرعت و قدرت کامل زبان PHP را در اختیار شما قرار می دهد. شما می توانید از پیکربندی Apache2+PHP+FastCGI و یا آنگونه که توضیح داده شده cgi استفاده کنید. دستورالعمل پیکربندی cgi.force_redirect از فراخوان مستقیم PHP از طریق یکURL مانند http://www.cyberciti.biz/cgi-bin/php/hackerdir/backdoor.php. پیشگیری می کند. برای ایجاد امنیت بیشتر cgi.force_redirect را روشن کنید. /etc/php.d/security.ini را ویرایش و دستورالعمل زیر را وارد کنید:

; Enable cgi.force_redirect for security reasons in a typical *Apache+PHP-CGI/FastCGI* setup

cgi.force_redirect=On

  1. کاربر PHP و ID گروهی

mod_fastcgi   یک ماژول cgi برای سرور Apache است. این ماژول می تواند به یک سرور خارجی FASTCGI وصل شود. لازم است که مطمئن شوید که PHP به عنوان یک کاربر معمولی (non- root) اجرا می شود. اگر PHP به عنوان یک کاربر اصلی یا UID کمتر از ۱۰۰ اجرا شود ، ممکن است به فایلهای سیستمی دسترسی داشته و آنها را تغییر دهد. باید برنامه های PHP CGI را  با استفاده از Apache’s suEXEC   یا  mod_suPHP. به عنوان یک کاربر عادی اجرا کنید. ویژگیهای suEXEC  این امکان را به کاربران سرور Apache می دهد که برنامه های CGI را  با یک ID متفاوت از ID مورد استفاده برای فراخوان سرور ، اجرا کنند. در مثال زیر برنامه های phpcgi با نام کاربری phpcgi و apache با نام کاربری apache اجرا شده اند:

# ps aux | grep php-cgi

 

نمونه ی خروجی:

phpcgi      ۶۰۱۲  ۰.۰  ۰.۴ ۲۲۵۰۳۶ ۶۰۱۴۰ ?        S    Nov22   ۰:۱۲ /usr/bin/php-cgi

phpcgi      ۶۰۵۴  )۰.۰  ۰.۵ ۲۲۹۹۲۸ ۶۲۸۲۰ ?        S    Nov22   ۰:۱۱ /usr/bin/php-cgi

phpcgi      ۶۰۵۵  ۰.۱  ۰.۴ ۲۲۴۹۴۴ ۵۳۲۶۰ ?        S    Nov22   ۰:۱۸ /usr/bin/php-cgi

phpcgi      ۶۰۸۵  ۰.۰  ۰.۴ ۲۲۴۶۸۰ ۵۶۹۴۸ ?        S    Nov22   ۰:۱۱ /usr/bin/php-cgi

phpcgi      ۶۱۰۳  ۰.۰  ۰.۴ ۲۲۴۵۶۴ ۵۷۹۵۶ ?        S    Nov22   ۰:۱۱ /usr/bin/php-cgi

phpcgi      ۶۸۱۵  ۰.۴  ۰.۵ ۲۲۸۵۵۶ ۶۱۲۲۰ ?        S    ۰۰:۵۲   ۰:۱۹ /usr/bin/php-cgi

phpcgi      ۶۸۲۱  ۰.۳  ۰.۵ ۲۲۸۰۰۸ ۶۱۲۵۲ ?        S    ۰۰:۵۵   ۰:۱۲ /usr/bin/php-cgi

phpcgi      ۶۸۲۳  ۰.۳  ۰.۴ ۲۲۵۵۳۶ ۵۸۵۳۶ ?        S    ۰۰:۵۷   ۰:۱۳ /usr/bin/php-cgi

می توانید به عنوان کاربر phpcgi از ابزاری مانند spawn-fcgi برای  ایجاد فرایندهای FastCGI لوکال و remote استفاده کنید.( نخست کاربر phpcgi را به سیستم اضافه کنید) :

# spawn-fcgi -a 127.0.0.1 -p 9000 -u phpcgi -g phpcgi -f /usr/bin/php-cgi

حال می توانید سرورهای Apache, Lighttpd و Nginx را برای استفاده ی Fast CGI php خارجی که بر روی پورت  ۹۰۰۰  در آدرس  ۱۲۷.۰.۰.۱ IPاجرا می شود ، پیکربندی کنید. اقدامات امنیتی | قسمت دوم

  1. دسترسی PHP را به فایلهای سیستمی محدود کنید

دستورالعمل open_basedir دایرکتوریهایی که PHP از طریق آنها اجازه ی دسترسی به فایلهای عملکردی نظیر fopen()  را دارد ، تعیین می کند. اگر فایلی خارج از مسیر تعیین شده ی open_basedir باشد ، php آن را باز نخواهد کرد. شما نمی توانید از یک لینک نمادین به عنوان راه فرعی استفاده کنید، مثلاً  فقط دسترسی به دایرکتوری  /var/www/html مجاز باشد و دسترسی به دایرکتوریهای /var/www, یا  /tmp یا /etc مجاز نباشد:

; Limits the PHP process from accessing files outside

; of specifically designated directories such as /var/www/html/

open_basedir=“/var/www/html/”

; ————————————

; Multiple dirs example

; open_basedir=”/home/httpd/vhost/cyberciti.biz/html/:/home/httpd/vhost/nixcraft.com/html/:/home/httpd/vhost/theos.in/html/”

; ————————————

نظر

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *