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
تمام خطاهای PHP را ثبت کنید
پیغامهای خطای PHP را برای همه ی بازدیدکنندگان سایت به نمایش نگذارید. /etc/php.d/security.ini را ویرایش کنید و دستورالعمل زیر را بنویسید:
display_errors=Off |
مطمئن شوید که تمام خطاهای PHP را در یک فایل ثبت کرده اید.
log_errors=On error_log=/var/log/httpd/php_scripts_error.log |
اجازه ندهید فایلها آپلود شوند
برای امنیت بیشتر ، با ویرایش /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=1M |
امکان اجرای دستورات 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 |
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 |
حجم پست ها را کنترل کنید
روش درخواست HTTP Post زمانی استفاده می شود که مشتری ( مرورگر یا کاربر) نیاز به ارسال اطلاعات به سرور Apache به عنوان بخشی از درخواست ، مثلاً آپلود یک فایل یا ثبت یک فرم تکمیل شده دارد. ممکن است مهاجمین سعی در ارسال Post بسیار بزرگ برای مصرف بیش از حد منابع سایت شما داشته باشند. شما می توانید حداکثر اندازه ی درخواست Post که PHP پردازش می کند ، را محدود کنید. /etc/php.d/security.ini را ویرایش و دستورالعمل زیر را وارد کنید:
; Set a realistic value here post_max_size=1K |
1K حداکثر اندازه ی 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> |
DoS )
می توانید حداکثر زمان اجرای هر فرمان PHP را بر حسب ثانیه تعیین کنید. گزینه ی دیگر تعیین حداکثر زمان لازم برای تجزیه و تحلیل اطلاعات یک درخواست توسط فرمانهای PHP و میزان حداکثر حافظه ای است که این فرمانها مصرف می کنند. /etc/php.d/security.ini را ویرایش و دستورالعمل زیر را وارد کنید:
# set in seconds max_execution_time = ۳۰ max_input_time = 30 memory_limit = 40M |
- سیستم حفاظتی پیشرفته ی Suhosin را برای PHP نصب کنید
Suhosin یک سیستم حفاظتی پیشرفته برای نصب PHP است. این سیستم برای حفاظت از سرورها و کاربران در برابر خطاهای شناخته شده و ناشناخته ی برنامه ها و هسته ی PHP طراحی شده است. سیستم Suhosin دو بخش مستقل دارد که می توانند به طور جداگانه و یا همراه با هم مورد استفاده قرار بگیرند. بخش اول یک برنامه ی کوچک برای هسته ی PHP است که حفاظت محدود و سطح پایینی در برابر جریان بیش از حد buffer و فرمت آسیبهای زنجیره ای ایجاد می کند و بخش دوم یک ضمیمه ی قدرتمند PHP است که سایر حفاظت ها را بر عهده دارد.
غیرفعال کردن عملکردهای خطرناک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 |
دستورالعمل 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 |
کاربر 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اجرا می شود ، پیکربندی کنید. اقدامات امنیتی | قسمت دوم
دسترسی 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/” ; ———————————— |