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

php.ini request_order 配置安全指南:預設 GP 風險與 CGP 推薦設定

     編輯:PHP 相關知識

背景

安裝 DedeCMS 等舊系統時,常遇到安裝檢查提示:

PHP 5.3 and above: Please set 'request_order' ini value to include C,G and P (recommended: 'CGP') in php.ini

request_order 作用

控制 $_REQUEST 超全域變數的資料來源順序與包含範圍:

字元來源超全域變數
GGET 參數$_GET
PPOST 表單$_POST
CCookie$_COOKIE

字元順序決定**覆蓋優先級**:靠右者覆蓋靠左者。

預設值風險分析

PHP 5.3+ 預設:request_order = "GP" (不包含 Cookie)

  • $_REQUEST 僅合併 $_GET + $_POST
  • 攻擊者可透過 Cookie 竄改 GLOBALS 等敏感變數,繞過 unset($GLOBALS[key]) 等防禦邏輯
  • 許多舊框架 (DedeCMS、Discuz 早期版、ThinkPHP 早期版) 依賴 $_REQUEST 獲取參數,且有全域變數保護機制,但保護機制通常只檢查 $_GET/$_POST,**忽略 $_COOKIE**,導致 Cookie 注入漏洞

推薦配置

; php.ini
request_order = "CGP"

含義:$_REQUEST = $_COOKIE + $_GET + $_POST (後者覆蓋前者)

  • Cookie 優先級最低,無法覆蓋 GET/POST 參數
  • GET 覆蓋 Cookie,POST 覆蓋 GET (最常見業務邏輯:表單提交優先)
  • 包含所有三大來源,避免變數「消失」導致邏輯錯誤

替代方案:variables_order

若 request_order 未設定,PHP 回退使用 variables_order (預設 EGPCS):

  • E: Environment ($_ENV)
  • G: GET
  • P: POST
  • C: Cookie
  • S: Server ($_SERVER)

建議:同時顯式設定兩者,避免歧義:

variables_order = "GPCS"
request_order = "CGP"
  • variables_order 控制 $_ENV、$_GET、$_POST、$_COOKIE、$_SERVER 的建立
  • request_order 專門控制 $_REQUEST 合併行為
  • 去除 E (環境變數) 減少攻擊面,S (Server) 僅內部使用

最佳實踐總結

  1. 現代框架 (Laravel/Symfony/Yii/ThinkPHP 5+):不依賴 $_REQUEST,明確使用 $request->input()、$request->get()、$request->post(),request_order 影響較小,仍建議設定 CGP 統一行為。
  2. 舊專案維護:務必設定 request_order = "CGP" 修補潛在 Cookie 注入風險。
  3. 安全審計:檢查代碼中是否直接使用 $_REQUEST,逐步重構為明確來源獲取。
  4. PHP 8.1+:$_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 來源)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved