| 場景 | register_globals = On | register_globals = Off (推薦) |
|---|---|---|
表單 <input name="user"> | 直接用 $user | 用 $_POST['user'] 或 $_GET['user'] |
URL ?id=123 | 直接用 $id | 用 $_GET['id'] |
Cookie sid=abc | 直接用 $sid | 用 $_COOKIE['sid'] |
| Session 讀取 | $username (需 session_register) | $_SESSION['username'] |
| Session 寫入 | session_register('var') | $_SESSION['var'] = $val |
在公共入口文件(如 config.inc.php)頂部加入:
<?php
if (!ini_get('register_globals')) {
// 反向模擬:將超全局解包為同名變量(僅作過渡,新代碼禁用)
foreach (['_POST', '_GET', '_SERVER', '_FILES', '_ENV', '_COOKIE'] as $super) {
if (isset($GLOBALS[$super])) {
extract($GLOBALS[$super], EXTR_SKIP); // SKIP 避免覆蓋已有變量
}
}
if (isset($_SESSION)) extract($_SESSION, EXTR_SKIP);
}
?>
警告:此方案僅為舊項目緊急兼容,新項目嚴禁使用,會重現安全隱患。
$_POST/$_GET/$_REQUEST 顯式獲取。Input::post('name', 'default', FILTER_SANITIZE_STRING)。Session::get('user.id')、Session::set('flash', 'msg')。display_errors,開啟 log_errors,生產環境零容忍 Notice/Warning。$_REQUEST 混合了 GET/POST/COOKIE,無法區分來源,敏感操作(刪除、支付)必須用 $_POST。extract() 覆蓋變量風險:extract($arr, EXTR_PREFIX_ALL, 'p') 加前綴更安全。register_globals=Off 就萬無一失,仍需防 XSS、SQLi、CSRF 等業務層漏洞。