$globals = array($_REQUEST, $_SESSION, $_SERVER, $_FILES);
foreach ($globals as $global) {
foreach (array_keys($global) as $key) {
unset(${$key}); // 動態變量銷毀
}
}
$globals:包含四個超全局數組的普通數組(非引用)。foreach:依次遍歷 $_REQUEST、$_SESSION、$_SERVER、$_FILES。array_keys($global):取出當前超全局數組的所有鍵名(如 'id'、'name')。unset(${$key}):變量變量語法。$key 值為字符串 'id',${'id'} 解析為變量 $id,unset 銷毀該變量。PHP 默認不自動將超全局數組鍵值註冊為同名變量(除非 register_globals=On,已廢棄)。但老代碼或某些框架可能手動執行 extract($_REQUEST) 導致污染。此代碼旨在批量銷毀所有超全局數組鍵名對應的普通變量,防止變量覆蓋、安全漏洞。
$a = 1; $b = 2; $c = 3;
foreach (array('a', 'b', 'c') as $k) echo ${$k}; // 輸出 123
證明 ${$k} 確實能按字符串動態訪問/操作變量。
php.ini 確保 register_globals = Off(PHP 5.4+ 已移除)。$_GET['id']、$_POST['name'],拒絕 extract()、$$key 等動態變量。filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT) 替代手動檢查。若在共享主機或舊項目中見到此類代碼,說明代碼庫曾受 register_globals 污染或存在變量覆蓋風險。建議全局搜索 extract(、$$、import_request_variables,徹底重構。