PHP被普遍用於各類Web開發。而當服務器端腳本配置錯誤時會出現各類問題。現今,大部分Web服務器是基於Linux環境下運行(好比:Ubuntu,Debian等)。本文例舉了十大PHP最佳安全實踐方式,可以讓您輕鬆、安全配置PHP。php
PHP安全性設置提示:html
DocumentRoot: /var/www/
Default Web server: Apache
Default PHP configuration file: /etc/php.ini
Default PHP extensions config directory: /etc/php.d/
Our sample php security config file: /etc/php.d/security.ini (you need to create this file using a text editor)
Operating systems: Ubuntu (the instructions should work with any other Linux distributions such as RHEL / CentOS / Fedora or other Unix like operating systems such as OpenBSD/FreeBSD/HP-UX).
1. 減小PHP內置模塊mysql
爲了加強性能和安全性,強烈建議,減小PHP中的模塊。來看看下面這個被執行命令安裝的模塊。程序員
1 # php –m
你將會獲得相似的結果:sql
你將會獲得相似的結果:shell
[PHP Modules]
apc
bcmath
bz2
calendar
Core
ctype
curl
date
dom
ereg
exif
fileinfo
filter
ftp
gd
gettext
gmp
hash
iconv
imap
json
libxml
mbstring
memcache
mysql
mysqli
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
readline
Reflection
session
shmop
SimpleXML
sockets
SPL
sqlite3
standard
suhosin
tokenizer
wddx
xml
xmlreader
xmlrpc
xmlwriter
xsl
zip
zlib
[Zend Modules]
Suhosin
刪除一個模塊,並執行此命令。例如:刪除模塊sqlite3apache
1 # rm /etc/php.d/sqlite3.ini
或者json
1 # mv /etc/php.d/sqlite3.ini /etc/php.d/sqlite3.disableRestrict
2. 使PHP信息泄露最小化安全
在默認PHP時在HTTP擡頭處會生成一條線介於每一個響應中,(好比X-Powered-By: PHP/5.2.10)。而這個在系統信息中爲攻擊者建立了一個很是有價值的信息。服務器
HTTP示例:
1 HTTP/1.1 200 OK 2 X-Powered-By: PHP/5.2.10 3 Content-type: text/html; charset=UTF-8 4 Vary: Accept-Encoding, Cookie 5 X-Vary-Options: Accept-Encoding;list-contains=gzip,Cookie;string-contains=wikiToken; 6 string-contains=wikiLoggedOut;string-contains=wiki_session 7 Last-Modified: Thu, 03 Nov 2011 22:32:55 GMT 8 ...
所以,咱們強烈建議,禁止PHP信息泄露,想要要禁止它,咱們要編輯/etc/php.d/secutity.ini,並設置如下指令:
1 expose_php=Off
3. 使PHP加載模塊最小化
在默認狀況下,RHEL加載的全部模塊能夠在/etc/php.d/目錄中找到。要禁用或啓用一個特定的模塊,只須要在配置文件/etc /php.d/目錄中中註釋下模塊名稱。而爲了優化PHP性能和安全性,當你的應用程序須要時,咱們強烈建議建議啓用擴展功能。舉個例子:當禁用GD擴展 時,鍵入如下命令:
1 # cd /etc/php.d/ 2 # mv gd.{ini,disable} 3 # /etc/init.d/apache2 restart
爲了擴展PGP GD模塊,而後鍵入如下命令:
1 # mv gd.{disable,ini} 2 # /sbin/service httpd restart
4. 記錄PHP錯誤信息
爲了提升系統和Web應用程序的安全,PHP錯誤信息不能被暴露出。要作到這一點,須要編輯/etc/php.d/security.ini 文件,並設置如下指令:
1 display_errors=Off
爲了便於開發者Bug修復,全部PHP的錯誤信息都應該記錄在日誌中。
1 log_errors=On 2 error_log=/var/log/httpd/php_scripts_error.log
5. 禁用遠程執行代碼
若是遠程執行代碼,容許PHP代碼從遠程檢索數據功能,如FTP或Web經過PHP來執行構建功能。好比:file_get_contents()。
不少程序員使用這些功能,從遠程經過FTP或是HTTP協議而得到數據。然而,此法在基於PHP應用程序中會形成一個很大的漏洞。因爲大部分程序員 在傳遞用戶提供的數據時沒有作到適當的過濾功能,打開安全漏洞而且建立了代碼時注入了漏洞。要解決此問題,須要禁用_url_fopen in /etc/php.d/security.ini,並設置如下命令:
1 allow_url_fopen=Off
除了這個,我還建議禁用_url_include以提升系統的安全性。
1 allow_url_include=Off
6. 禁用PHP中的危險函數
PHP中有不少危險的內置功能,若是使用不當,它可能使你的系統崩潰。你能夠建立一個PHP內置功能列表經過編輯/etc/php.d/security.ini來禁用它。
1 disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
7. 資源控制
爲了提升系統的穩定性,強烈建議設置每一個腳本解析請求數據所花費的時間和腳本可能消耗的最大內存量。正確的配置這些參數能夠防止PHP任何腳本消耗太多的資源或是內存,從而避免系統不安全或下降安全係數。
1 # set in seconds 2 max_execution_time = 30 3 max_input_time = 30 4 memory_limit = 40M
8. 限制PHP訪問文件系統
該open_basedir指令指定的目錄是容許PHP訪問使用fopen()等功能。若是任何腳本試圖訪問超出open_basdir定義的路徑文件,PHP將拒絕打開。值得注意的是,你不能使用一個符號連接做爲一種變通方法。
1 ; Limits the PHP process from accessing files outside 2 ; of specifically designated directories such as /var/www/html/ 3 open_basedir="/var/www/html/" 4 ; ------------------------------------ 5 ; Multiple dirs example 6 ; open_basedir="/home/httpd/vhost/cyberciti.biz/html/:/home/httpd/vhost/nixcraft.com/html/:/home/httpd/vhost/theos.in/html/" 7 ; ------------------------------------
9.限制文件/目錄訪問
進行適當的安全設置:確保Apache做爲非root用戶運行,好比www-data或www。對於文件和目錄在基於/var/www/下一樣屬於非root用戶。想要更改全部者,執行如下命令:
1 # chown -R apache:apache /var/www/
10.編譯保護Apache,PHP和MySQL的配置文件
使用charrt命令編譯保護配置文件
1 # chattr +i /etc/php.ini 2 # chattr +i /etc/php.d/* 3 # chattr +i /etc/my.ini 4 # chattr +i /etc/httpd/conf/httpd.conf 5 # chattr +i /etc/
使用charrt命令能夠編譯保護PHP文件或者是文件中的/var/www/html的目錄:
1 # chattr +i /var/www/html/file1.php 2 # chattr +i /var/www/html/