PHP 開發團隊很高興宣佈 PHP 5.4.2 立即釋出。此版本提供安全性修正。
在某些基於 CGI 的設定中存在一個漏洞,至少 8 年來一直未被發現。CGI 規範的第 7 節指出
某些系統支援一種方法,可以將字串陣列提供給 CGI 腳本。這僅在「已索引」查詢的情況下使用。這是由不包含任何未編碼 "=" 字元的 URL 搜尋字串的 "GET" 或 "HEAD" HTTP 請求所識別。因此,在某些 CGI 實作中,查詢字串中沒有 "=" 的請求與有 "=" 的請求的處理方式不同。對於 PHP 來說,這表示包含 ?-s 的請求可能會轉儲頁面的 PHP 原始碼,但是包含 ?-s&a=1 的請求則沒問題。
許多網站以 Apache 模組 (透過 mod_php) 或在 nginx 下使用 php-fpm 來執行 PHP。這些設定都沒有此漏洞。直接的 shebang 樣式 CGI 看起來也沒有漏洞。
如果您使用 Apache mod_cgi 來執行 PHP,您可能會受到影響。要查看您是否受影響,只需在任何 URL 的末尾添加 ?-s。如果您看到您的原始碼,則表示您受到影響。如果您的網站正常呈現,則表示您沒有受到影響。
更糟的是,我們的錯誤回報系統中存在一個錯誤,該錯誤會將錯誤回報的私人標誌在對錯誤回報發表評論時切換為公開,導致此問題在我們有時間將解決方案測試到我們希望的程度之前就公開了。
要修復此問題,請更新至 PHP 5.3.12 或 PHP 5.4.2。我們知道,由於這是一種相當過時的執行 PHP 的方式,將這些網站升級到現代版本的 PHP 可能不可行,因此另一種方法是配置您的 Web 伺服器,使其不允許這些類型的請求,其查詢字串以 "-" 開頭且不包含 "="。添加類似這樣的規則不應該破壞任何網站。對於使用 mod_rewrite 的 Apache,它看起來會像這樣
RewriteCond %{QUERY_STRING} ^(%2d|-)[^=]+$ [NC] RewriteRule ^(.*) $1? [L]
如果您要編寫自己的規則,請務必將 urlencode 的 ?%2ds 版本考慮在內。
有關 PHP 5.4.2 的原始碼下載,請造訪我們的下載頁面,Windows 二進位檔可以在 windows.php.net/download/ 上找到。 還有一個變更日誌。