萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP register_globals 在 5.4.0 移除後的應對策略

register_globals 於 PHP 4.2.0 預設關閉,PHP 5.3.0 棄用,PHP 5.4.0 **完全移除**。舊專案若依賴此功能(自動將 EGPCS 變數註冊為全域變數)將無法運作。本文說明安全風險與遷移方案。

危險範例

<?php
// register_globals = On 時
if (is_user()) { $flag = true; } // 若未初始化 $flag = false
// 攻擊者請求 user.php?flag=1 即可繞過驗證
if ($flag) { include '/highly/sensitive/data.php'; }
?>

問題:未初始化變數 + 自動註冊 = **變數注入漏洞**。

遷移方案

1. 顯式從超全域陣列取值(推薦)

$flag = $_POST['flag'] ?? false; // 或 $_GET、$_REQUEST
if (is_user()) $flag = true;

2. 相容性輔助函數(暫時過渡)

function register_globals_compat() {
    if (!ini_get('register_globals')) {
        foreach (['_GET','_POST','_COOKIE','_SERVER','_ENV','_FILES','_REQUEST'] as $g) {
            foreach ($GLOBALS[$g] as $k => $v) {
                $GLOBALS[$k] = $v; // 模擬行為,極不推薦生產使用
            }
        }
    }
}

3. 修正所有未初始化變數

  • 全專案搜尋未宣告即使用的變數。
  • 統一在開頭初始化:$flag = false; $user = null;。

現代最佳實踐

  • **永遠關閉 register_globals**(已成歷史)。
  • 使用 $_GET、$_POST、$_REQUEST 明確來源。
  • 啟用 error_reporting(E_ALL) 捕獲未定義變數警告。
  • 採用框架(Laravel, Symfony, CodeIgniter)統一請求處理。

php.ini 相關設定

; 已移除,無法設定
; register_globals = Off
; 相關:variables_order = "GPCS" (控制 $_REQUEST 合併順序)
copyright © 萬盛學電腦網 all rights reserved