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

PHP 超全域變數完整指南:九大陣列、作用域、安全與最佳實踐

     編輯:PHP 相關知識

前言

超全域變數在所有作用域自動可用,無需 global 宣告。PHP 提供九大內建超全域陣列,分別承載不同來源的輸入資料。掌握它們的來源、結構、安全風險與正確使用方式,是寫出健壯 PHP 應用的基石。

九大超全域陣列速覽

變數來源典型鍵值安全風險建議處理
$GLOBALS全域符號表所有全域變數名稱任意修改全域狀態極少直接使用,改用依賴注入
$_SERVERWeb 伺服器環境REQUEST_URI, HTTP_HOST, REMOTE_ADDR, HTTP_USER_AGENT部分鍵可偽造(如 HTTP_X_FORWARDED_FOR)信任 SERVER_ADDR、REQUEST_TIME 等伺服器端產生鍵
$_GETURL 查詢字串?id=123&sort=descXSS、SQLi、邏輯繞過輸出前 htmlspecialchars、查詢用預處理
$_POSTHTTP 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
$_COOKIEHTTP Cookie 標頭session_id, remember_token竊取、竄改、XSS 讀取HttpOnly、Secure、SameSite、簽名驗證
$_REQUEST$_GET + $_POST + $_COOKIE (順序由 request_order 決定)混合輸入來源模糊、Cookie 覆蓋 GET/POST不建議使用,明確指定來源
$_SESSION伺服器端 Session 儲存user_id, permissions, csrf_tokenSession 劫持、固定攻擊HTTPS、session.use_strict_mode、再生成 ID
$_ENV環境變數APP_ENV, DB_PASSWORD敏感資訊洩露生產環境禁用 variables_order 中的 E

variables_order 與 request_order

; 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 洩露密鑰。

關鍵安全實務

1. 取得真實 Client IP

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';
}

2. 防 XSS 輸出

function h(string $str): string {
    return htmlspecialchars($str, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
echo '
' . h($_GET['q']) . '
';

3. CSRF 保護


// 產生
$_SESSION['csrf'] = bin2hex(random_bytes(32));
// 驗證
if (!hash_equals($_SESSION['csrf'], $_POST['csrf'] ?? '')) {
    http_response_code(403);
    exit('Invalid CSRF token');
}

4. 檔案上傳安全

$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");

常見面試/考題精選

  1. var_dump(0 == "ads") 結果?bool(true)。字串轉數值為 0,鬆散比較相等。=== 則為 false。
  2. Exception 可被 clone?不可,__clone 宣告為 private。
  3. Traits 特性?橫向重用、不可實例化、可定義靜態方法/屬性、衝突需用 insteadof/as 解決。
  4. Session 若禁用 Cookie 能用嗎?能,啟用 session.use_trans_sid 或手動透過 URL/隱藏欄位傳遞 session_id(現代框架多自動處理)。
  5. $php_errormsg 永遠可用?否,需 track_errors=On 且僅在錯誤發生作用域內。

命令列 (CLI) 差異

  • $_SERVER['argv']、$argc 可用,$_GET/$_POST/$_COOKIE/$_FILES 為空陣列。
  • $_SERVER['REQUEST_METHOD'] 不存在。

總結

超全域變數是 PHP 接收外部輸入的唯一管道。原則:輸入過濾、輸出轉義、來源明確、最小權限。棄用 $_REQUEST、register_globals、magic_quotes 等舊特性,擁抱現代框架提供的 Request 物件與驗證器,構建安全可維護的應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved