register_globals 於 PHP 4.2.0 預設關閉,PHP 5.3.0 棄用,PHP 5.4.0 **完全移除**。舊專案若依賴此功能(自動將 EGPCS 變數註冊為全域變數)將無法運作。本文說明安全風險與遷移方案。
<?php
// register_globals = On 時
if (is_user()) { $flag = true; } // 若未初始化 $flag = false
// 攻擊者請求 user.php?flag=1 即可繞過驗證
if ($flag) { include '/highly/sensitive/data.php'; }
?>
問題:未初始化變數 + 自動註冊 = **變數注入漏洞**。
$flag = $_POST['flag'] ?? false; // 或 $_GET、$_REQUEST
if (is_user()) $flag = true;
function register_globals_compat() {
if (!ini_get('register_globals')) {
foreach (['_GET','_POST','_COOKIE','_SERVER','_ENV','_FILES','_REQUEST'] as $g) {
foreach ($GLOBALS[$g] as $k => $v) {
$GLOBALS[$k] = $v; // 模擬行為,極不推薦生產使用
}
}
}
}
$flag = false; $user = null;。$_GET、$_POST、$_REQUEST 明確來源。error_reporting(E_ALL) 捕獲未定義變數警告。; 已移除,無法設定
; register_globals = Off
; 相關:variables_order = "GPCS" (控制 $_REQUEST 合併順序)