首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 從 4.0.6 升級至 4.2.1 必讀:register_globals 關閉帶來的變量獲取變革

     編輯:PHP 相關知識

升級後的慘痛教訓

某購物網站在將 PHP 從 4.0.6 升級至 4.2.0 後,原有程序全面失效。根因在於 php.ini 新增預設配置:

register_globals = Off

影響範圍

開啟時,PHP 自動將 $_GET、$_POST、$_COOKIE、$_SESSION、$_SERVER 等超全域陣列中的鍵值註冊為同名全域變量(如 $id、$username)。關閉後,不再自動註冊,直接使用 $id 將得到 NULL 或觸發 Notice。

此變更旨在防止「變量中毒」攻擊:惡意用戶可通過 URL 參數覆蓋內部關鍵變量(如 $is_admin = true),導致權限繞過。

正確的變量獲取方式(兼容 On/Off)

無論 register_globals 如何設置,以下寫法均安全可靠:

數據來源獲取方式
Cookie$_COOKIE['variable'] 或 $HTTP_COOKIE_VARS['variable'] (PHP 4.1.0 前)
Session$_SESSION['variable'] 或 $HTTP_SESSION_VARS['variable']
POST 表單$_POST['variable'] 或 $HTTP_POST_VARS['variable']
GET 參數$_GET['variable'] 或 $HTTP_GET_VARS['variable']
伺服器變量$_SERVER['REMOTE_ADDR'] 等
上傳文件$_FILES 或 $HTTP_POST_FILES

最佳實踐

  1. 立即改用超全域陣列($_GET、$_POST 等),棄用直接變量名。
  2. 在代碼規範中強制要求顯式來源前綴,提升可讀性與安全性。
  3. 若維護舊代碼且無法全面重構,可在入口文件開頭手動導入(極不推薦):
    extract($_GET); extract($_POST); // 僅作過渡,會重現安全隱患

結論: 提前適應 register_globals = Off 是 PHP 開發者邁向安全編程的必修課。

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