網路應用程式安全指南/PHP 特定問題
使用 PHP 語言時,需要考慮幾個問題。
使用 PHP 時...
- 不要使用簡寫形式“
<?”,始終使用完整形式“<?php” - 使用 nginx 網路伺服器時,請確保正確按照官方安裝說明進行操作,並注意“陷阱”頁面。注意,教程中經常包含有效但配置不安全的示例。
preg_replace在某些情況下可以充當eval()。避免將使用者輸入傳遞給它。如果必須這樣做,請正確過濾和轉義它。- 使用Suhosin(如果可能,包括補丁),並使用嚴格規則配置它
- 啟用
suhosin.executor.disable_emodifier - 如果可能,啟用
suhosin.executor.disable_eval - 如果可能,將
suhosin.mail.protect設定為 2
- 啟用
- 將 PHP 從舊版本更新到 PHP 5.4 時,確保舊版應用程式不依賴於 magic quotes 來實現安全性。
基本原理
PHP 可以支援簡化的 PHP 程式碼開始標記。如果啟用了該選項,"<?php" 和 "<?" 都可以單獨開始一個 PHP 程式碼塊。但是,如果停用了該選項,"<?" 將不會被檢測到,程式碼將被傳遞到瀏覽器。這會導致程式碼洩露。使用完整形式可以確保程式碼正常工作,並且如果伺服器不支援簡短標記,也不會洩露程式碼。
使用 nginx 伺服器時,很容易犯導致使用者可以將影像檔案傳遞到 PHP 直譯器中的嚴重配置錯誤。有關更多資訊,請參閱“陷阱”頁面。它還提供了一些有價值的提示,可能會幫助您節省一些用於查詢幻象問題的時間,因此如果您使用 nginx,則應該閱讀它。
如果在搜尋正則表示式中提供了非標準的 "e" 修飾符,preg_replace 會將替換文字評估為 PHP 程式碼。如果攻擊者可以影響正則表示式以新增此修飾符並提供自定義替換文字,則 preg_replace 允許任意程式碼執行。使用此函式時要格外小心,在可能的情況下使用preg_quote並使用正確設定的定界符引數進行轉義。如果必須接受來自使用者的正則表示式程式碼,請確保它不能包含定界符(還要考慮使用格式錯誤的 UTF-8、空位元組等進行攻擊) - 但如果可能,請完全避免使用它。
Suhosin 可以阻止對 Web 應用程式的某些攻擊,並停用不安全的函式。該補丁還保護內部記憶體結構免受某些記憶體損壞攻擊。(另請參閱功能列表,以瞭解完整的功能列表,以及官方解釋 Suhosin 有用的原因。)Suhosin 提高了您的安全性,但與 Web 應用程式防火牆一樣,它不會神奇地使所有應用程式都安全。
停用 e 修飾符可以阻止攻擊者利用上面提到的 preg_replace 中的漏洞,即使應用程式存在漏洞。e 修飾符不應該使用,停用 e 修飾符後無法工作的應用程式是有問題的。禁止 eval 可能會破壞合法的應用程式。考慮首先在模擬模式下執行 Suhosin,以發現(編碼不當的)使用它的應用程式。設定 suhosin.mail.protect 可以阻止使用您的郵件表單傳送垃圾郵件的攻擊。(同樣,請首先使用模擬模式來確定您的應用程式是否與它相容。)
magic quotes 已在 PHP 5.4 中刪除。如果安裝了更新,依賴於 magic quotes 來實現安全性的應用程式將變得容易受到攻擊。請注意,這並不意味著您不應該更新;相反,您應該修復(即重寫或刪除)應用程式。magic quotes 不是轉義輸入的合適方法,在大多數情況下,它不能防禦所有攻擊向量。依賴於 magic quotes 的應用程式可能很古老,或者在沒有考慮到安全性的情況下編寫的。簡單地新增模擬 magic quotes 的程式碼是一個糟糕的想法。