这是一个非常基础但至关重要的PHP配置,理解它对于网站安全、代码调试和日常开发都很有帮助。

request_order 是什么?
request_order 是PHP.ini中的一个核心配置指令,它定义了PHP如何组合 $_GET, $_POST, 和 $_COOKIE 这三个超全局变量,最终形成 $_REQUEST 这个“万能”数组。
$_REQUEST = $_GET + $_POST + $_COOKIE,但 request_order 决定了这三者的优先级。
为什么 request_order 很重要?
在早期的PHP版本(5.3.0之前),这个配置项是 variables_order 的一部分。variables_order 控制了所有超全局变量的创建顺序(包括 $_GET, $_POST, $_COOKIE, $_SERVER 等)。
从 PHP 5.3.0 开始,为了安全和清晰,request_order 被独立出来,专门控制 $_REQUEST 的来源和优先级。

主要影响:
- 安全性:这是最重要的原因。
$_COOKIE的优先级高于$_POST,那么攻击者就可以通过发送一个恶意的 Cookie 来覆盖掉表单提交的POST数据,一个修改用户密码的表单,如果攻击者设置一个user_id的Cookie,它的优先级又高于POST,那么服务器就可能用攻击者提供的user_id去执行修改密码的操作,而忽略了表单里真正的用户ID。 - 数据覆盖:即使没有恶意攻击,在开发中也可能会遇到意外,URL中有一个
id=1(GET),表单里也有一个id=2(POST)。GP顺序,$_POST['id']会覆盖$_GET['id'],反之亦然,明确这个顺序可以让你在编写代码时更有预见性。 - 代码可读性与维护性:在团队开发中,统一
request_order的配置可以避免因环境不同(开发机、测试机、线上服务器)而导致代码行为不一致的问题,减少不必要的调试时间。
request_order 的值与优先级
request_order 的值是一个字符串,由以下字符组成,它们的顺序就代表了优先级,从左到右,优先级由低到高。
G(GET)P(POST)C(COOKIE)
示例:
假设 request_order = "GP"。
-
$_GET和$_POST优先级:$_POST的值会覆盖$_GET的值。
(图片来源网络,侵删)- URL:
?id=10 - POST表单:
id=20 - 结果:
$_REQUEST['id']的值会是20(来自POST)。
- URL:
-
$_GET和$_POST都没有:如果URL和表单都没有id这个参数,$_REQUEST['id]会去查找$_COOKIE中的id。 -
$_COOKIE的优先级:由于C不在"GP"这个字符串中,$_COOKIE的数据不会被包含在$_REQUEST中,这极大地提高了安全性,因为攻击者无法通过Cookie轻易地覆盖GET或POST数据。
织梦CMS (DedeCMS) 中的实践
织梦CMS作为一个老牌的PHP系统,其代码编写风格深受早期PHP环境的影响,它在很多地方都直接使用 $_REQUEST 来获取数据,
// 在文章列表页,常见于 arc.listview.class.php $typeid = isset($_REQUEST['typeid']) ? intval($_REQUEST['typeid']) : 0; // 在文章内容页,常见于 arc.archives.class.php $aid = isset($_REQUEST['aid']) ? intval($_REQUEST['aid']) : 0;
这种写法虽然方便,但带来了安全隐患。
织梦的常见配置
在织梦的安装目录下,有一个 data 文件夹,里面通常会有一个 config.cache.inc.php 文件(或者直接是 config.inc.php),这个文件是安装时生成的,里面包含了数据库连接信息等核心配置。
重要提示: 织梦不会在 config.inc.php 中直接设置 request_order,这个配置是PHP服务器的全局设置,通常在 php.ini 文件中定义,织梦的代码行为会受制于服务器上的 request_order 设置。
对安全的影响
假设一个攻击者想要获取网站后台的密码,他可能会尝试通过Cookie注入的方式,如果服务器的 request_order 设置为 GPC,那么Cookie的优先级最高,如果某个织梦的文件(比如某个未严格校验的插件文件)使用了 $_REQUEST['password'],攻击者就可能通过发送恶意Cookie来获取权限。
如何在织梦环境中安全地处理 request_order?
作为开发者或网站管理员,你有两种方式来确保安全。
修改服务器 php.ini(推荐,一劳永逸)
这是最根本、最安全的方法。
-
找到你的服务器上的
php.ini文件。 -
找到
request_order这一行。 -
强烈建议将其设置为
GP:request_order = "GP"
这个设置意味着:
$_REQUEST只包含$_GET和$_POST的数据。$_POST的数据会覆盖$_GET的数据(这通常是期望的行为,表单提交的数据优先级更高)。- 完全排除了
$_COOKIE,有效防止了Cookie注入攻击。
-
保存
php.ini文件,并重启你的Web服务(如Apache或Nginx)。
修改织梦代码(治标不治本,但可以作为临时措施)
如果你没有权限修改 php.ini,可以尝试修改织梦的代码,使其变得更安全。
原则:永远不要直接使用 $_REQUEST。
-
明确数据来源:根据你的业务逻辑,明确这个参数应该来自GET还是POST,然后使用对应的超全局变量。
- URL参数:使用
$_GET。 - 表单提交:使用
$_POST。 - Session/用户信息:使用
$_SESSION。
- URL参数:使用
-
代码修改示例:
修改前(不安全):
$id = isset($_REQUEST['id']) ? intval($_REQUEST['id']) : 0;
修改后(安全):
// 如果id是URL传递的,/article.php?id=123 $id = isset($_GET['id']) ? intval($_GET['id']) : 0; // 如果id是表单POST提交的 $id = isset($_POST['id']) ? intval($_POST['id']) : 0;
对于织梦这样庞大的系统,要找到所有使用
$_REQUEST的地方并逐一修改,工作量非常大,且容易引入新的错误。修改php.ini是首选方案。
| 特性 | 描述 |
|---|---|
| 定义 | request_order 是PHP配置,决定 $_GET, $_POST, $_COOKIE 如何组合成 $_REQUEST 及其优先级。 |
| 重要性 | 极高,直接关系到网站安全,特别是防止Cookie注入攻击。 |
| 织梦影响 | 织梦代码大量使用 $_REQUEST,其行为受服务器 request_order 设置的直接影响,存在潜在风险。 |
| 安全配置 | 强烈建议将 php.ini 中的 request_order 设置为 "GP",以排除 $_COOKIE 的干扰。 |
| 最佳实践 | 在编写新代码时,避免使用 $_REQUEST,应根据数据来源明确使用 $_GET 或 $_POST。 |
对于织梦用户来说,最关键的一步就是联系你的主机服务商,确认并修改服务器的 request_order 配置为 GP,这是提升织梦网站安全性的最简单有效的方法之一。
