可能受到的攻擊
如果不想把 PHP 嵌入到服務器端軟件(如 Apache)作為一個模塊安裝的話,可以選擇以
CGI 的模式安裝。或者把 PHP 用于不同的 CGI
封裝以便為代碼創(chuàng)建安全的 chroot 和 setuid 環(huán)境。這種安裝方式通常會把
PHP 的可執(zhí)行文件安裝到 web 服務器的 cgi-bin
目錄。CERT 建議書 ? CA-96.11
建議不要把任何的解釋器放到 cgi-bin 目錄。盡管 PHP
可以作為一個獨立的解釋器,但是它的設計使它可以防止下面類型的攻擊:
-
訪問系統(tǒng)文件:http://my.host/cgi-bin/php?/etc/passwd
在 URL 請求的問號(?)后面的信息會傳給 CGI
接口作為命名行的參數(shù)。其它的解釋器會在命令行中打開并執(zhí)行第一個參數(shù)所指定的文件。
但是,以 CGI 模式安裝的 PHP 解釋器被調(diào)用時,它會拒絕解釋這些參數(shù)。
-
訪問服務器上的任意目錄:http://my.host/cgi-bin/php/secret/doc.html
好像上面這種情況,PHP 解釋器所在目錄后面的 URL 信息
/secret/doc.html 將會例行地傳給
CGI 程序并進行解釋。通常一些 web
服務器的會將它重定向到頁面,如
http://my.host/secret/script.php。如果是這樣的話,某些服務器會先檢查用戶訪問
/secret 目錄的權限,然后才會創(chuàng)建
http://my.host/cgi-bin/php/secret/script.php
上的頁面重定向。不幸的是,很多服務器并沒有檢查用戶訪問
/secret/script.php 的權限,只檢查了
/cgi-bin/php 的權限,這樣任何能訪問
/cgi-bin/php 的用戶就可以訪問
web 目錄下的任意文件了。
在 PHP 里,運行時配置指令
cgi.force_redirect、
doc_root 和
user_dir
都可以為服務器上的文件和目錄添加限制,用于防止這類攻擊。下面將對各個選項的設置進行詳細講解。