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

PHP 獲取請求參數三大核心方式:$_GET、$_POST、$_REQUEST 差異與最佳實踐

     編輯:PHP 相關知識

PHP 通過超全局數組獲取客戶端提交數據,理解三者差異、優先級、安全性,是構建健壯 Web 應用的基礎。

三大超全局數組對比

數組數據來源HTTP 方法典型場景安全性
$_GETURL 查詢字符串GET、HEAD搜索、分頁、篩選、可分享鏈接低(明文、長度限制、日誌記錄)
$_POST請求體POST、PUT、PATCH表單提交、文件上傳、敏感操作、大數據中(不在 URL、但明文傳輸需 HTTPS)
$_REQUEST合併:GET + POST + COOKIE所有快速原型、兼容舊代碼**低(來源不確定、COOKIE 污染風險)**

核心差異深度解析

1. $_REQUEST 合併順序與覆蓋規則

受 request_order (PHP 5.3+) 或 variables_order 配置影響,默認 GP (GET 後 POST,POST 覆蓋 GET),若包含 C 則 COOKIE 最後覆蓋。

// php.ini
request_order = "GPC"  // GET → POST → COOKIE (後者覆蓋前者)
variables_order = "EGPCS" // 環境、GET、POST、COOKIE、SERVER

風險: 攻擊者可通過 Cookie 覆蓋 GET/POST 參數,繞過業務邏輯。

2. 內容類型影響 $_POST 填充

  • application/x-www-form-urlencoded:標準表單,自動填充 $_POST
  • multipart/form-data:文件上傳,自動填充 $_POST + $_FILES
  • application/json:不自動填充 $_POST,需 file_get_contents('php://input') 手動解析

3. 獲取原始輸入流

$raw = file_get_contents('php://input'); // 獲取原始請求體
// 適用:JSON API、XML RPC、原始文本、二進制數據
// 注意:只能讀取一次(除非啟用 php://temp 緩存)

最佳實踐指南

✅ 推薦:顯式來源,拒絕 $_REQUEST

// 搜索接口:明確用 GET
$keyword = $_GET['q'] ?? '';
$page = (int)($_GET['page'] ?? 1);

// 表單提交:明確用 POST
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';

// 文件上傳
$avatar = $_FILES['avatar'] ?? null;

✅ 統一入口封裝:Request 對象 (PSR-7)

// 現代框架統一用 ServerRequestInterface
$request = $this->getRequest(); // 或從容器獲取
$keyword = $request->getQueryParams()['q'] ?? '';
$username = $request->getParsedBody()['username'] ?? '';
$jsonData = $request->getParsedBody(); // 已解析 JSON

✅ 輸入驗證與過濾

// 白名單過濾
$allowed = ['name', 'email', 'age'];
$input = array_intersect_key($_POST, array_flip($allowed));

// 類型轉換與驗證
$age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT, [
    'options' => ['min_range' => 1, 'max_range' => 120]
]);
if ($age === false) { /* 驗證失敗 */ }

❌ 避免:盲目使用 $_REQUEST

// 危險:來源不明,Cookie 可注入
$id = $_REQUEST['id']; 
// 攻擊者設置 Cookie: id=malicious_sql
// 導致 SQL 注入、越權訪問等

安全加固清單

  1. 禁用 $_REQUEST: 代碼規範禁止,靜態分析檢測
  2. HTTPS 強制: 所有表單提交頁面強制 HTTPS
  3. CSRF 保護: 狀態改變操作驗證 Token
  4. 輸入長度限制: Nginx client_max_body_size + PHP 邏輯截斷
  5. 文件上傳驗證: MIME 類型、副檔名、內容掃描、存儲隔離

框架差異速查

框架獲取 GET獲取 POST獲取 JSON原始輸入
Laravel$request->query('key')$request->input('key')$request->input('key') (自動解析)$request->getContent()
Symfony$request->query->get('key')$request->request->get('key')json_decode($request->getContent(), true)$request->getContent()
ThinkPHPRequest::get('key')Request::post('key')Request::param('key') (自動識別)file_get_contents('php://input')
Yii2$request->get('key')$request->post('key')$request->getBodyParams()$request->getRawBody()

明確數據來源、拒絕隱式合併、統一驗證入口,是 PHP 參數處理的職業素養。

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