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

PHP register_globals 開關差異詳解與遷移指南

     編輯:PHP 綜合知識

On 與 Off 的行為對比

場景register_globals = Onregister_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

為何必須用 Off

  1. 安全:防止變量注入攻擊(見前文漏洞案例)。
  2. 兼容:PHP 5.4+ 已移除該指令,代碼必須適配 Off 模式才能升級。
  3. 可讀性:顯式來源($_POST/$_GET)一目了然,利於維護。

舊代碼快速遷移方案

在公共入口文件(如 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);
}
?>

警告:此方案僅為舊項目緊急兼容,新項目嚴禁使用,會重現安全隱患。

現代最佳實踐

  1. 全項目統一使用 $_POST/$_GET/$_REQUEST 顯式獲取。
  2. 表單處理類封裝輸入驗證:Input::post('name', 'default', FILTER_SANITIZE_STRING)。
  3. Session 操作封裝:Session::get('user.id')、Session::set('flash', 'msg')。
  4. 關閉 display_errors,開啟 log_errors,生產環境零容忍 Notice/Warning。

常見誤區

  • $_REQUEST 混合了 GET/POST/COOKIE,無法區分來源,敏感操作(刪除、支付)必須用 $_POST。
  • extract() 覆蓋變量風險:extract($arr, EXTR_PREFIX_ALL, 'p') 加前綴更安全。
  • 以為 register_globals=Off 就萬無一失,仍需防 XSS、SQLi、CSRF 等業務層漏洞。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved