如果將 PHP 配置為對所有的 Environment、GET、POST、Cookie 及 Server 變量進行全局注冊,會導致意外行為,使系統容易受到攻擊者的攻擊。
如果啟用 register_globals 選項,會導致 PHP 對 EGPCS(Environment、GET、POST、Cookie 及 Server)變量進行全局注冊,這樣一來,任何用戶在任何 PHP 程序中都將能訪問這些變量。如果程序員在編寫程序時啟用此選項,或多或少都會導致程序察覺不到它們所依賴于的數值來源,這會導致運行正常的環境發生意外行為,使系統容易受到惡意環境中的攻擊者發起的攻擊。由于認識到 register_globals 所隱含的安全隱患,在 PHP 4.2.0 中默認禁用了該選項,而在 PHP 6 中棄用并刪除了該選項。
例 1:以下代碼容易受到 cross-site scripting 攻擊。程序員假定 $username 的值來源于由服務器控制的會話,但是攻擊者可能會為 $username 提供一個惡意值來代替請求參數。如果啟用 register_globals 選項,此代碼會在它所生成的 HTML 內容中包含由攻擊者提交的惡意值。
<?php
if (isset($username)) {
echo "Hello <b>$username</b>";
} else {
echo "Hello <b>Guest</b><br />";
echo "Would you like to login?";
}
?>
[1] Standards Mapping - OWASP Top 10 2004 - (OWASP 2004) A10 Insecure Configuration Management
[2] Standards Mapping - OWASP Top 10 2010 - (OWASP 2010) A6 Security Misconfiguration
[3] Standards Mapping - Common Weakness Enumeration - (CWE) CWE ID 473
[4] M. Achour et al. PHP Manual
[5] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1 - (PCI 1.1) Requirement 6.5.10
[6] Artur Maj Securing PHP