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

PHP $_REQUEST 陣列安全隱患深度解析

     編輯:PHP 相關知識

便利背後的風險

許多開發者為了省去判斷 POST/GET 的程式碼,習慣直接使用 $_REQUEST。但深入分析會發現,$_REQUEST 不僅合併 $_GET 和 $_POST,還包含 $_COOKIE 所有資料,這帶來嚴重的資料來源混淆風險。

實際測試驗證

建立測試檔 req.php:

<?php
var_dump($_GET['a'], $_POST['a'], $_REQUEST['a']);
?>
<html>
<head><title>demo</title></head>
<body>
    <form method='post' action='req.php?a=xxx'>
        <input type='hidden' name='a' value='yyy'/>
        <input type='submit' name='submit' value='submit'/>
    </form>
</body>
</html>

提交表單後輸出:

string(3) "xxx" string(3) "yyy" string(3) "yyy"

$_REQUEST['a'] 取到的是 POST 值 yyy,覆蓋了 GET 的 xxx。

根本原因:variables_order 設定

PHP 設定檔 php.ini 中的 variables_order 決定註冊順序與覆蓋優先級:

; This directive describes the order in which PHP registers GET, POST, Cookie,
; Environment and Built-in variables (G, P, C, E & S respectively, often
; referred to as EGPCS or GPC). Registration is done from left to right, newer
; values override older values.
variables_order = "EGPCS"

EGPCS 含義:

  • E = $_ENV
  • G = $_GET
  • P = $_POST
  • C = $_COOKIE
  • S = $_SESSION

預設 EGPCS 表示:後註冊的覆蓋先註冊的,故 POST 覆蓋 GET,COOKIE 覆蓋 POST。

效能與安全雙重代價

  • 效能: $_REQUEST 需合併多個超全域陣列,比直接存取 $_GET/$_POST 慢
  • 安全: 无法分辨資料來源,易導致 CSRF、參數污染等風險

最佳實務建議

  1. 明確指定來源: 使用 $_GET['param']、$_POST['param']、$_COOKIE['param']
  2. 停用 $_REQUEST: 在 php.ini 設定 request_order = "GP"(排除 Cookie)或框架層面封禁
  3. 輸入驗證: 針對來源實施差異化驗證邏輯
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved