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

PHP 九大超全局變量(預定義變量)全景圖解與使用指南

     編輯:PHP 相關知識

超全局變量總覽

PHP 提供 9 個超全局變量,作用域覆蓋整個腳本,無需 global 聲明即可在函數/類中直接訪問。它們是 PHP 與外部世界(HTTP、CLI、會話、環境)交互的核心接口。

變量來源數據類型典型用途安全等級
$GLOBALS腳本內部關聯數組(引用所有全局變量)調試、動態變量名訪問高(僅內部)
$_SERVERWeb Server + PHP關聯數組請求/環境信息、路由、安全判斷中(含客戶端可控字段)
$_GETURL 查詢字符串關聯數組查詢參數、分頁、篩選、幂等操作低(用戶完全可控)
$_POSTHTTP Body (application/x-www-form-urlencoded, multipart/form-data)關聯數組表單提交、狀態變更操作低
$_COOKIEHTTP Cookie 標頭關聯數組會話識別、偏好設置、追蹤低(可竄改、XSS 風險)
$_FILESHTTP multipart 上傳二維關聯數組文件上傳處理低(需 is_uploaded_file 驗證)
$_ENVShell 環境變量關聯數組配置管理(Docker/K8s 注入)、區分環境高(服務器端注入)
$_REQUEST$_GET + $_POST + $_COOKIE 合併關聯數組快速原型、兼容舊代碼極低(來源混淆、優先級陷阱)
$_SESSIONSession 存儲(文件/Redis/DB)關聯數組用戶狀態、購物車、權限緩存高(服務端存儲,需防劫持)

深度解析重點變量

$_FILES 結構詳解

$_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)
];

$_REQUEST 合併優先級陷阱

<?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

$_ENV 與配置管理最佳實踐

<?php
// .env 文件(不提交代碼庫)
// APP_ENV=production
// DB_PASSWORD=secret123

// 入口文件加載(vlucas/phpdotenv)
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

// 使用
$dbPass = $_ENV['DB_PASSWORD'] ?? getenv('DB_PASSWORD');

$_SESSION 安全加固

<?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 或覆蓋。

CLI 環境差異

變量Web (FPM/Apache)CLI
$_SERVER豐富 HTTP 信息僅 SERVER_*、argv/argc、REQUEST_TIME
$_GET/$_POST/$_COOKIE解析請求空數組
$_FILES上傳文件空數組
$_ENV繼承自 Web Server 進程繼承自 Shell 環境
$_SESSION可用需手動 session_start(),存儲路徑需寫權限

總結:選對變量,守住邊界

  1. 查詢/幂等 → $_GET
  2. 狀態變更 → $_POST
  3. 文件上傳 → $_FILES + is_uploaded_file()
  4. 會話狀態 → $_SESSION(配合安全配置)
  5. 環境配置 → $_ENV(配合 phpdotenv)
  6. 請求元數據 → $_SERVER(白名單字段)
  7. 拒絕 $_REQUEST,消除來源模糊風險。

九大超全局變量是 PHP 應用的「感覺器官」,精準使用、嚴格驗證,才能構建健壯安全的系統。

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