|
PHP是一種開源服務(wù)器端腳本語(yǔ)言,應(yīng)用很廣泛。Apache web服務(wù)器提供了這種便利:通過HTTP或HTTPS協(xié)議,訪問文件和內(nèi)容。配置不當(dāng)?shù)姆?wù)器端腳本語(yǔ)言會(huì)帶來(lái)各種各樣的問題。所以,使用PHP時(shí)要小心。以下是25個(gè)PHP安全方面的最佳實(shí)踐,可供系統(tǒng)管理員們安全地配置PHP。 為PHP安全提示而提供的示例環(huán)境 文件根目錄(DocumentRoot):/var/www/html 默認(rèn)的Web服務(wù)器:Apache(可以使用Lighttpd或Nginx來(lái)取代Apache) 默認(rèn)的PHP配置文件:/etc/php.ini 默認(rèn)的PHP加載模塊配置目錄:/etc/php.d/ 我們的示例php安全配置文件:/etc/php.d/security.ini(需要使用文本編輯器來(lái)創(chuàng)建該文件) 操作系統(tǒng):RHEL/CentOS/Fedora Linux(相關(guān)指令應(yīng)該與Debian/Ubuntu等其他任何Linux發(fā)行版或者OpenBSD/FreeBSD/HP-UX等其他類似Unix的操作系統(tǒng)兼容)。 默認(rèn)的php服務(wù)器TCP/UDP端口:無(wú) 為本文所列的大多數(shù)操作編寫代碼時(shí),假定它們將由運(yùn)行bash外殼程序或其他任何現(xiàn)代外殼程序的根用戶來(lái)執(zhí)行: $ php -v 示例輸出: PHP 5.3.3 (cli) (built: Oct 24 2011 08:35:41) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies 出于演示的用途,我會(huì)使用以下操作系統(tǒng): $ cat /etc/redhat-release 示例輸出: Red Hat Enterprise Linux Server release 6.1 (Santiago) 第1個(gè)最佳實(shí)踐:了解你的對(duì)手 基于PHP的應(yīng)用程序面臨不同類型的攻擊。我注意到了幾種不同類型的攻擊: 1. XSS:跨站腳本是Web PHP應(yīng)用程序中的一種安全漏洞,攻擊者可以利用該漏洞來(lái)竊取用戶的信息。你可以配置Apache,編寫更安全的PHP腳本(驗(yàn)證所有的用戶輸入),以避免XSS攻擊。 2. SQL注入攻擊:這是PHP應(yīng)用程序的數(shù)據(jù)庫(kù)層中的安全漏洞。用戶輸入不正確地過濾時(shí),應(yīng)用程序就能執(zhí)行任何SQL語(yǔ)句。你可以配置Apache,編寫安全代碼(驗(yàn)證和轉(zhuǎn)換所有的用戶輸入),以避免SQL注入攻擊。PHP中的一個(gè)常見做法是,在發(fā)送SQL查詢之前,使用名為mysql_real_escape_string()的函數(shù),轉(zhuǎn)換參數(shù)。 3. 文件上傳:它讓訪客可以將文件放在(將文件上傳到)你的服務(wù)器上。這會(huì)帶來(lái)眾多安全問題,比如刪除你的文件、刪除數(shù)據(jù)庫(kù)、獲取用戶詳細(xì)資料,不一而足。你可以使用php來(lái)禁用文件上傳,或編寫安全代碼(比如驗(yàn)證用戶輸入,只允許PNG或GIF等圖像文件類型)。 4. 添加本地和遠(yuǎn)程文件:攻擊者可以從遠(yuǎn)程服務(wù)器打開文件,執(zhí)行任何PHP代碼。這讓他們得以上傳文件、刪除文件和安裝后門??梢耘渲胮hp以禁用遠(yuǎn)程文件執(zhí)行功能。 5. eval() :將字符串作為PHP代碼來(lái)進(jìn)行評(píng)估。攻擊者常常利用該函數(shù)來(lái)隱藏其在服務(wù)器本身上面的代碼和工具。你可以配置PHP,禁用eval()。 6. sea-surf攻擊(跨站請(qǐng)求偽造,CSRF):這種攻擊迫使最終用戶針對(duì)目前已驗(yàn)證其身份的Web應(yīng)用程序執(zhí)行有害的操作。如果是平常的用戶,得逞的CSRF攻擊會(huì)危及最終用戶的數(shù)據(jù)和操作。但如果被盯上的最終用戶使用管理員帳戶,這會(huì)危及整個(gè)Web應(yīng)用程序。 第2個(gè)最佳實(shí)踐:查找內(nèi)置的PHP模塊 想查看一組編譯進(jìn)去的PHP模塊,請(qǐng)輸入以下命令: # php -m 示例輸出: [PHP模塊] 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模塊] Suhosin 我建議你使用模塊數(shù)量減少的PHP,以增強(qiáng)性能和安全。比如說(shuō),你可以通過刪除(移除)配置文件或者更名(或移動(dòng))一個(gè)名為/etc/php.d/sqlite3.ini的文件來(lái)禁用sqlite3模塊,操作如下: # rm /etc/php.d/sqlite3.ini 或者 # mv /etc/php.d/sqlite3.ini /etc/php.d/sqlite3.disable 其他編譯進(jìn)去的模塊只能通過重新安裝精簡(jiǎn)配置的PHP來(lái)移除??梢詮膒hp.net下載php源代碼,然后按以下方法編譯它,支持GD、fastcgi和MySQL: ./configure --with-libdir=lib64 --with-gd --with-mysql --prefix=/usr --exec-prefix=/usr 第3個(gè)最佳實(shí)踐:限制PHP信息泄露 要限制PHP信息泄露,就要禁用expose_php。編輯/etc/php.d/secutity.ini,執(zhí)行以下指令: expose_php=Off 啟用后,expose_php向外界報(bào)告PHP安裝在服務(wù)器上,這包括HTTP頭里面的PHP版本(如X-Powered-By: PHP/5.3.3)。PHP標(biāo)識(shí)的全局唯一標(biāo)識(shí)符(GUID,見示例9568F34-D428-11d2-A769-00AA001ACF42)也顯示出來(lái),因而將它們添加到支持PHP的網(wǎng)站的URL后面,就會(huì)顯示相應(yīng)標(biāo)識(shí)。expose_php啟用后,你可以使用以下命令,查看PHP版本: $ curl -I 示例輸出: HTTP/1.1 200 OK X-Powered-By: PHP/5.3.3 Content-type: text/html; charset=UTF-8 Vary: Accept-Encoding, Cookie X-Vary-Options: Accept-Encoding;list-contains=gzip,Cookie;string-contains=wikiToken;string-contains=wikiLoggedOut;string-contains=wiki_session Last-Modified: Thu, 03 Nov 2011 22:32:55 GMT ... 我還建議,你應(yīng)在httpd.conf中執(zhí)行ServerTokens和ServerSignature命令,隱藏Apache版本及其他信息()。 第4個(gè)最佳實(shí)踐:盡量減少可裝入的PHP模塊(動(dòng)態(tài)加載模塊) PHP支持“動(dòng)態(tài)加載模塊”(Dynamic Extensions)。默認(rèn)情況下,RHEL裝入/etc/php.d/目錄里面的所有加載模塊。要啟用或禁用某一個(gè)模塊,只要在/etc/php.d/目錄中找到配置文件、為模塊名稱添加注釋。你還可以更名或刪除模塊配置文件。想獲得最佳的PHP性能和安全,你應(yīng)該只啟用Web應(yīng)用程序需要的加載模塊。比如說(shuō),要禁用gd加載模塊,輸入以下命令: # cd /etc/php.d/ # mv gd.{ini,disable} # /sbin/service httpd restart 要啟用名為gd的php模塊,請(qǐng)輸入: # mv gd.{disable,ini} # /sbin/service httpd restart 第5個(gè)最佳實(shí)踐:將所有PHP錯(cuò)誤記入日志 別讓PHP錯(cuò)誤信息暴露在網(wǎng)站的所有訪客面前。編輯/etc/php.d/security.ini,執(zhí)行以下指令: display_errors=Off 確保你將所有PHP錯(cuò)誤記入到日志文件中(): log_errors=On error_log=/var/log/httpd/php_scripts_error.log 第6個(gè)最佳實(shí)踐:不允許上傳文件 出于安全原因,編輯/etc/php.d/security.ini,執(zhí)行以下命令: file_uploads=Off 如果使用你應(yīng)用程序的用戶需要上傳文件,只要設(shè)置upload_max_filesize(),即可啟用該功能,該設(shè)置限制了PHP允許通過上傳的文件的最大值: file_uploads=On # 用戶通過PHP上傳的文件最大1MB upload_max_filesize=1M 第7個(gè)最佳實(shí)踐:關(guān)閉遠(yuǎn)程代碼執(zhí)行 如果啟用,allow_url_fopen允許PHP的文件函數(shù)——如file_get_contents()、include語(yǔ)句和require語(yǔ)句——可以從遠(yuǎn)程地方(如FTP或網(wǎng)站)獲取數(shù)據(jù)。 allow_url_fopen選項(xiàng)允許PHP的文件函數(shù)——如file_get_contents()、include語(yǔ)句和require語(yǔ)句——可以使用FTP或HTTP協(xié)議,從遠(yuǎn)程地方獲取數(shù)據(jù)。編程員們常常忘了這一點(diǎn),將用戶提供的數(shù)據(jù)傳送給這些函數(shù)時(shí),沒有進(jìn)行適當(dāng)?shù)妮斎脒^濾,因而給代碼注入安全漏洞留下了隱患?;赑HP的Web應(yīng)用程序中存在的眾多代碼注入安全漏洞是由啟用allow_url_fopen和糟糕的輸入過濾共同引起的。編輯/etc/php.d/security.ini,執(zhí)行以下指令:
信息發(fā)布:廣州名易軟件有限公司 http://www.jetlc.com
|