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

PHP 超全域陣列完整指南:$_GET/$_POST/$_SESSION/$_SERVER 等九大超全域變數

     編輯:PHP 綜合知識

超全域陣列在所有作用域自動可見,無需 global 宣告,是 PHP 處理 HTTP 請求、環境資訊、會話狀態的核心介面。本文系統整理九大超全域陣列用途、安全風險與最佳實踐。

一、九大超全域陣列速覽

陣列來源典型用途安全風險
$_GETURL 查詢字串分頁、搜尋、篩選、靜態連結XSS、CSRF、資訊洩露、SQL Injection
$_POSTHTTP POST Body表單提交、API 輸入、狀態變更CSRF、XSS、大量資料 DoS
$_REQUEST$_GET+$_POST+$_COOKIE快速原型(不建議生產)來源混淆、Cookie 覆蓋 POST/GET
$_FILESmultipart/form-data 上傳檔案上傳處理任意檔案上傳、路徑遍歷、MIME 偽裝
$_COOKIEHTTP Cookie 標頭偏好設定、追蹤、記住登入XSS 竊取、CSRF、敏感資料洩露
$_SESSION伺服器端會話儲存使用者狀態、購物車、權限快取Session Fixation、Hijacking、資料洩露
$_ENV環境變數部署設定、密鑰、特徵開關敏感資訊洩露(勿輸出)
$_SERVERWeb 伺服器環境請求資訊、路徑、標頭、腳本路徑偽造標頭、路徑洩露、內部 IP 洩露
$GLOBALS全域符號表極少數跨檔案全域狀態命名衝突、隱性耦合、難以測試

二、核心陣列深度解析

1. $_GET / $_POST 安全存取模式

<?php
// ❌ 危險:直接使用,未驗證、未轉義
echo $_GET['name'];

// ✅ 安全:過濾輸入、輸出轉義
$name = filter_input(INPUT_GET, 'name', FILTER_SANITIZE_SPECIAL_CHARS);
echo $name; // 已轉義

// ✅ 表單處理:POST-Redirect-GET 防重複提交
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
    if ($email) {
        // 處理業務邏輯...
        header('Location: success.php');
        exit;
    }
}
?>

2. $_FILES 上傳處理標準流程

if (isset($_FILES['avatar'])) {
    $file = $_FILES['avatar'];
    
    // 檢查錯誤碼
    if ($file['error'] !== UPLOAD_ERR_OK) {
        throw new RuntimeException('上傳失敗: ' . $file['error']);
    }
    
    // 驗證 MIME(需搭配 finfo,不可信任瀏覽器提供的 type)
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    $mime = $finfo->file($file['tmp_name']);
    $allowed = ['image/jpeg', 'image/png', 'image/webp'];
    if (!in_array($mime, $allowed, true)) {
        throw new RuntimeException('不支援的檔案類型');
    }
    
    // 驗證大小
    if ($file['size'] > 2 * 1024 * 1024) { // 2MB
        throw new RuntimeException('檔案過大');
    }
    
    // 安全儲存:隨機檔名、存放非公開目錄
    $ext = ['image/jpeg'=>'jpg', 'image/png'=>'png', 'image/webp'=>'webp'][$mime];
    $dest = '/var/www/uploads/' . bin2hex(random_bytes(16)) . ".$ext";
    if (!move_uploaded_file($file['tmp_name'], $dest)) {
        throw new RuntimeException('移動檔案失敗');
    }
}

3. $_SESSION 安全設定

<?php
// 必須在任何輸出前呼叫
session_start();

// 安全配置(建議在 php.ini 或啟動腳本集中設定)
ini_set('session.cookie_httponly', '1');     // 阻止 JS 存取
ini_set('session.cookie_secure', '1');       // 僅 HTTPS 傳輸
ini_set('session.use_strict_mode', '1');     // 拒絕未初始化 ID
ini_set('session.cookie_samesite', 'Strict'); // CSRF 防護

// 重新產生 ID 防 Session Fixation
if (!isset($_SESSION['initiated'])) {
    session_regenerate_id(true);
    $_SESSION['initiated'] = true;
}

// 存取
$_SESSION['user_id'] = 123;
$userId = $_SESSION['user_id'] ?? null;

4. $_SERVER 關鍵鍵名對照

鍵名含義可信度
REQUEST_METHODGET/POST/PUT...高
REQUEST_URI完整請求路徑含查詢字串高
HTTP_HOSTHost 標頭中(可偽造)
HTTP_USER_AGENTUser-Agent低(可偽造)
HTTP_REFERERReferer 標頭低(可偽造/缺失)
REMOTE_ADDR客戶端 IP中(代理下需讀 X-Forwarded-For)
SCRIPT_FILENAME執行腳本絕對路徑高
DOCUMENT_ROOT網站根目錄高

5. $_ENV 與 getenv()

<?php
// 讀取環境變數(.env 檔案需搭配 vlucas/phpdotenv 載入)
$dbHost = $_ENV['DB_HOST'] ?? getenv('DB_HOST') ?? 'localhost';
// 生產環境敏感設定務必從環境變數讀取,勿寫死程式碼

三、函數內直接存取超全域(無需 global)

function logRequest() {
    // 直接可用
    $method = $_SERVER['REQUEST_METHOD'];
    $ip = $_SERVER['REMOTE_ADDR'];
    error_log("[$method] $ip");
}

logRequest(); // 正常運作

四、$GLOBALS 用法與反模式

$config = ['debug' => true];

function getConfig() {
    // ❌ 反模式:隱性依賴全域狀態
    return $GLOBALS['config'];
}

// ✅ 良模式:依賴注入
function getConfig(array $config) {
    return $config;
}
// 或使用服務容器/單例模式

五、register_globals 歷史遺毒(已移除)

PHP 4.2 預設關閉、5.4 移除 register_globals。舊碼 echo $username; 直接使用查詢字串變數極度危險,務必改用 $_GET['username']。

六、最佳實踐清單

  1. 輸入過濾、輸出轉義:filter_input() + htmlspecialchars()。
  2. 拒絕 $_REQUEST:明確使用 $_GET/$_POST,避免 Cookie 覆蓋。
  3. CSRF Token:所有狀態變更表單驗證 Token。
  4. Session 安全旗標:httponly、secure、samesite、strict_mode。
  5. 檔案上傳:MIME 驗證、大小限制、隨機命名、非公開目錄。
  6. 環境變數管理敏感設定:$_ENV + phpdotenv,勿提交 .env 至版控。
  7. 減少全域狀態:避免 $GLOBALS、global,改用依賴注入。

總結:超全域陣列是 PHP 與外部世界溝通的橋樑。理解各陣列來源、可信度、安全風險,配合「輸入過濾、輸出轉義、最小權限、明確來源」原則,即能建構安全可靠的 Web 應用程式。

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