register_globals 是 PHP 4 時代的特性,啟用時會自動將 $_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER 等超全域陣列的鍵值直接註冊為全域變數。
<?php
// 假設 URL: test.php?user=admin&pass=123
// register_globals = On 時:
echo $user; // 直接輸出 'admin' (未經 $_GET['user'])
echo $pass; // 直接輸出 '123'
?>
?is_admin=1 可能覆蓋程式內部 $is_admin 判斷邏輯,繞過權限檢查。$authenticated) 可被外部直接設定為 true。<?php
// 明確來源、可追蹤、可過濾
$user = $_GET['user'] ?? '';
$pass = $_POST['pass'] ?? '';
$sessionId = $_COOKIE['PHPSESSID'] ?? '';
?>
<?php
// 過濾輸入
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$age = filter_input(INPUT_GET, 'age', FILTER_VALIDATE_INT, ['options' => ['min_range' => 18]]);
// 手動驗證
$name = trim($_POST['name'] ?? '');
if ($name === '') { /* 錯誤處理 */ }
?>
<?php
// Laravel/Service Container 範例
$request = app('request'); // 或注入 Request $request
$user = $request->input('user');
$validated = $request->validate([
'email' => 'required|email',
'age' => 'required|integer|min:18',
]);
?>
$id 非來自 $_GET['id'])。php.ini 無 register_globals = On (PHP 5.4+ 會直接報錯)。register_globals 是 PHP 歷史上最大的設計失誤之一,已徹底移除超過十年。任何仍建議開啟此選項的教學/框架 (如舊版 ThinkPHP 1.x/2.x) 皆為過時且不安全。現代 PHP 開發請堅持:顯式輸入來源、嚴格驗證過濾、依賴注入管理相依性。