某購物網站在將 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),導致權限繞過。
無論 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 |
$_GET、$_POST 等),棄用直接變量名。extract($_GET); extract($_POST); // 僅作過渡,會重現安全隱患結論: 提前適應 register_globals = Off 是 PHP 開發者邁向安全編程的必修課。