超全域變數在所有作用域自動可用,無需 global 宣告。PHP 提供九大內建超全域陣列,分別承載不同來源的輸入資料。掌握它們的來源、結構、安全風險與正確使用方式,是寫出健壯 PHP 應用的基石。
| 變數 | 來源 | 典型鍵值 | 安全風險 | 建議處理 |
|---|---|---|---|---|
$GLOBALS | 全域符號表 | 所有全域變數名稱 | 任意修改全域狀態 | 極少直接使用,改用依賴注入 |
$_SERVER | Web 伺服器環境 | REQUEST_URI, HTTP_HOST, REMOTE_ADDR, HTTP_USER_AGENT | 部分鍵可偽造(如 HTTP_X_FORWARDED_FOR) | 信任 SERVER_ADDR、REQUEST_TIME 等伺服器端產生鍵 |
$_GET | URL 查詢字串 | ?id=123&sort=desc | XSS、SQLi、邏輯繞過 | 輸出前 htmlspecialchars、查詢用預處理 |
$_POST | HTTP POST body (application/x-www-form-urlencoded, multipart/form-data) | 表單欄位 | CSRF、大量資料攻擊 | CSRF Token、限制 post_max_size |
$_FILES | 檔案上傳 | name, type, tmp_name, error, size | 惡意檔案、路徑遍歷、MIME 偽造 | 驗證副檔名/MIME、隨機重命名、移出 webroot |
$_COOKIE | HTTP Cookie 標頭 | session_id, remember_token | 竊取、竄改、XSS 讀取 | HttpOnly、Secure、SameSite、簽名驗證 |
$_REQUEST | $_GET + $_POST + $_COOKIE (順序由 request_order 決定) | 混合輸入 | 來源模糊、Cookie 覆蓋 GET/POST | 不建議使用,明確指定來源 |
$_SESSION | 伺服器端 Session 儲存 | user_id, permissions, csrf_token | Session 劫持、固定攻擊 | HTTPS、session.use_strict_mode、再生成 ID |
$_ENV | 環境變數 | APP_ENV, DB_PASSWORD | 敏感資訊洩露 | 生產環境禁用 variables_order 中的 E |
; php.ini
variables_order = "GPCS" ; 載入順序:GET → POST → COOKIE → SERVER (ENV 預設不載入)
request_order = "GP" ; $_REQUEST 合併順序:GET → POST (不含 COOKIE,較安全)
建議:request_order = "GP" 避免 Cookie 污染 $_REQUEST;生產環境 variables_order 移除 E 防止 $_ENV 洩露密鑰。
function getClientIp(): string {
$headers = ['HTTP_CF_CONNECTING_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_REAL_IP', 'HTTP_CLIENT_IP'];
foreach ($headers as $h) {
if (!empty($_SERVER[$h])) {
$ips = explode(',', $_SERVER[$h]);
return trim($ips[0]);
}
}
return $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
}
function h(string $str): string {
return htmlspecialchars($str, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
echo '' . h($_GET['q']) . '';
// 產生
$_SESSION['csrf'] = bin2hex(random_bytes(32));
// 驗證
if (!hash_equals($_SESSION['csrf'], $_POST['csrf'] ?? '')) {
http_response_code(403);
exit('Invalid CSRF token');
}
$allowed = ['jpg', 'png', 'gif', 'pdf'];
$ext = strtolower(pathinfo($_FILES['up']['name'], PATHINFO_EXTENSION));
if (!in_array($ext, $allowed, true)) exit('Invalid extension');
$newName = bin2hex(random_bytes(16)) . '.' . $ext;
move_uploaded_file($_FILES['up']['tmp_name'], "/var/uploads/$newName");
var_dump(0 == "ads") 結果?bool(true)。字串轉數值為 0,鬆散比較相等。=== 則為 false。__clone 宣告為 private。insteadof/as 解決。session.use_trans_sid 或手動透過 URL/隱藏欄位傳遞 session_id(現代框架多自動處理)。$php_errormsg 永遠可用?否,需 track_errors=On 且僅在錯誤發生作用域內。$_SERVER['argv']、$argc 可用,$_GET/$_POST/$_COOKIE/$_FILES 為空陣列。$_SERVER['REQUEST_METHOD'] 不存在。超全域變數是 PHP 接收外部輸入的唯一管道。原則:輸入過濾、輸出轉義、來源明確、最小權限。棄用 $_REQUEST、register_globals、magic_quotes 等舊特性,擁抱現代框架提供的 Request 物件與驗證器,構建安全可維護的應用。