幾乎所有的cgi程式都有這樣的 bug,只是具體的表現方式不一樣罷了。
一、涉及到的危險函數〔include(),require()和include_once(),require_once()〕
include() && require()語句:包括並運行指定檔案。
這兩種結構除了在如何處理失敗之外完全一樣。include() 產生一個警告而 require() 則導致一個致命錯誤。換句話說,如果你想在遇到丟失檔案時停止處理頁面就用 require()。include() 就不是這樣,指令碼會繼續運行。
如果"allow_url_fopen"在 PHP 中被啟用(預設配置),也可以用 URL(通過 HTTP 或者其它支援的封裝協議)而不是本地檔案來指定要被包括的檔案。如果目標伺服器將目標檔案作為 PHP 代碼解釋,則可以用適用於 HTTP GET 的 URL 請求字串來向被包括的檔案傳遞變數。
詳細參考:http://cn.php.net/manual/en/function.include.php
require_once() && include_once()
require_once ()和include_once() 語句在指令碼執行期間包括並運行指定檔案。此行為和 require() 語句類似,唯一區別是如果該檔案中的代碼已經被包括了,則不會再次包括。適用於在指令碼執行期間同一個檔案有可能被包括超過一次的情況下,你想確保它只被包括一次以避免函數重定義,變數重新賦值等問題。
詳細參考:http://cn.php.net/manual/en/function.require-once.php
二、為什麼要包含檔案
程式員寫程式的時候,不喜歡幹同樣的事情,也不喜歡把同樣的代碼(比如一些公用的函數)寫幾次,於是就把需要公用的代碼寫在一個單獨的檔案裡面,比如 share.php,而後在其它檔案進行包含調用。在php裡,我們就是使用上面列舉的那幾個函數來達到這個目的的,它的工作流程:如果你想在 main.php裡包含share.php,我將這樣寫include("share.php")就達到目的,然後就可以使用share.php中的函數了,像這個寫死需要包含的檔案名稱的自然沒有什麼問題,也不會出現漏洞,那麼問題到底是出在哪裡呢?
有的時候可能不能確定需要包含哪個檔案,比如先來看下面這個檔案index.php的代碼:
[code]
if ($_GET