首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

PHP 變量銷毀黑魔法:$globals 遍歷 unset 解析

     編輯:程式設計疑難解答

代碼還原與執行效果

$globals = array($_REQUEST, $_SESSION, $_SERVER, $_FILES);

foreach ($globals as $global) {
    foreach (array_keys($global) as $key) {
        unset(${$key});  // 動態變量銷毀
    }
}

逐行解析

  1. $globals:包含四個超全局數組的普通數組(非引用)。
  2. 外層 foreach:依次遍歷 $_REQUEST、$_SESSION、$_SERVER、$_FILES。
  3. 內層 array_keys($global):取出當前超全局數組的所有鍵名(如 'id'、'name')。
  4. 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 最佳實踐

  • 禁用 register_globals: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,徹底重構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved