PHP 提供 9 個超全局變量,作用域覆蓋整個腳本,無需 global 聲明即可在函數/類中直接訪問。它們是 PHP 與外部世界(HTTP、CLI、會話、環境)交互的核心接口。
| 變量 | 來源 | 數據類型 | 典型用途 | 安全等級 |
|---|---|---|---|---|
$GLOBALS | 腳本內部 | 關聯數組(引用所有全局變量) | 調試、動態變量名訪問 | 高(僅內部) |
$_SERVER | Web Server + PHP | 關聯數組 | 請求/環境信息、路由、安全判斷 | 中(含客戶端可控字段) |
$_GET | URL 查詢字符串 | 關聯數組 | 查詢參數、分頁、篩選、幂等操作 | 低(用戶完全可控) |
$_POST | HTTP Body (application/x-www-form-urlencoded, multipart/form-data) | 關聯數組 | 表單提交、狀態變更操作 | 低 |
$_COOKIE | HTTP Cookie 標頭 | 關聯數組 | 會話識別、偏好設置、追蹤 | 低(可竄改、XSS 風險) |
$_FILES | HTTP multipart 上傳 | 二維關聯數組 | 文件上傳處理 | 低(需 is_uploaded_file 驗證) |
$_ENV | Shell 環境變量 | 關聯數組 | 配置管理(Docker/K8s 注入)、區分環境 | 高(服務器端注入) |
$_REQUEST | $_GET + $_POST + $_COOKIE 合併 | 關聯數組 | 快速原型、兼容舊代碼 | 極低(來源混淆、優先級陷阱) |
$_SESSION | Session 存儲(文件/Redis/DB) | 關聯數組 | 用戶狀態、購物車、權限緩存 | 高(服務端存儲,需防劫持) |
$_FILES['avatar'] = [
'name' => 'photo.jpg', // 客戶端文件名(不可信)
'type' => 'image/jpeg', // 客戶端 MIME(不可信)
'tmp_name' => '/tmp/phpA1B2C3', // 服務端臨時路徑(唯一可信)
'error' => UPLOAD_ERR_OK, // 錯誤碼
'size' => 123456, // 字節大小
'full_path'=> 'photo.jpg' // PHP 8.1+ 完整路徑(webkitdirectory)
];
<?php
// php.ini: request_order = "GPC" (默認)
// 合併順序:GET -> POST -> COOKIE (後者覆蓋前者)
// 例:?id=1 POST id=2 Cookie id=3 => $_REQUEST['id'] = '3' (Cookie 勝出)
// 風險:攻擊者通過 Cookie 覆蓋 POST 參數繞過 CSRF 保護
// 建議:生產代碼**禁用 $_REQUEST**,顯式使用 $_GET/$_POST/$_COOKIE
<?php
// .env 文件(不提交代碼庫)
// APP_ENV=production
// DB_PASSWORD=secret123
// 入口文件加載(vlucas/phpdotenv)
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
// 使用
$dbPass = $_ENV['DB_PASSWORD'] ?? getenv('DB_PASSWORD');
<?php
// 必須在 session_start() 前設置
ini_set('session.cookie_httponly', 1); // 禁止 JS 訪問
ini_set('session.cookie_secure', 1); // 僅 HTTPS 傳輸
ini_set('session.cookie_samesite', 'Lax'); // CSRF 防護
ini_set('session.use_strict_mode', 1); // 防止會話固定
ini_set('session.sid_length', 48); // 更長 Session ID
session_start();
// 重新生成 ID(登錄後、權限變更後)
session_regenerate_id(true);
$GLOBALS 包含所有全局變量的引用,print_r($GLOBALS) 會遞歸輸出極大結構,慎用。$_FILES/$_POST,處理完及時 unset 或覆蓋。| 變量 | Web (FPM/Apache) | CLI |
|---|---|---|
| $_SERVER | 豐富 HTTP 信息 | 僅 SERVER_*、argv/argc、REQUEST_TIME |
| $_GET/$_POST/$_COOKIE | 解析請求 | 空數組 |
| $_FILES | 上傳文件 | 空數組 |
| $_ENV | 繼承自 Web Server 進程 | 繼承自 Shell 環境 |
| $_SESSION | 可用 | 需手動 session_start(),存儲路徑需寫權限 |
$_GET$_POST$_FILES + is_uploaded_file()$_SESSION(配合安全配置)$_ENV(配合 phpdotenv)$_SERVER(白名單字段)九大超全局變量是 PHP 應用的「感覺器官」,精準使用、嚴格驗證,才能構建健壯安全的系統。