安裝 DedeCMS 等舊系統時,常遇到安裝檢查提示:
PHP 5.3 and above: Please set 'request_order' ini value to include C,G and P (recommended: 'CGP') in php.ini
控制 $_REQUEST 超全域變數的資料來源順序與包含範圍:
| 字元 | 來源 | 超全域變數 |
|---|---|---|
| G | GET 參數 | $_GET |
| P | POST 表單 | $_POST |
| C | Cookie | $_COOKIE |
字元順序決定**覆蓋優先級**:靠右者覆蓋靠左者。
PHP 5.3+ 預設:request_order = "GP" (不包含 Cookie)
$_REQUEST 僅合併 $_GET + $_POSTGLOBALS 等敏感變數,繞過 unset($GLOBALS[key]) 等防禦邏輯$_REQUEST 獲取參數,且有全域變數保護機制,但保護機制通常只檢查 $_GET/$_POST,**忽略 $_COOKIE**,導致 Cookie 注入漏洞; php.ini
request_order = "CGP"
含義:$_REQUEST = $_COOKIE + $_GET + $_POST (後者覆蓋前者)
若 request_order 未設定,PHP 回退使用 variables_order (預設 EGPCS):
$_ENV)$_SERVER)建議:同時顯式設定兩者,避免歧義:
variables_order = "GPCS"
request_order = "CGP"
variables_order 控制 $_ENV、$_GET、$_POST、$_COOKIE、$_SERVER 的建立request_order 專門控制 $_REQUEST 合併行為E (環境變數) 減少攻擊面,S (Server) 僅內部使用$_REQUEST,明確使用 $request->input()、$request->get()、$request->post(),request_order 影響較小,仍建議設定 CGP 統一行為。request_order = "CGP" 修補潛在 Cookie 注入風險。$_REQUEST,逐步重構為明確來源獲取。$_REQUEST 行為不變,但棄用動態屬性,注意配合升級。<?php
// test_request_order.php
$_GET['test'] = 'GET';
$_POST['test'] = 'POST';
$_COOKIE['test'] = 'COOKIE';
echo "request_order: " . ini_get('request_order') . "\n";
echo "\$_REQUEST['test'] = " . ($_REQUEST['test'] ?? 'NOT SET') . "\n";
// CGP -> POST
// GPC -> POST
// PGC -> GET
// GP -> POST (無 Cookie 來源)