$_REQUEST
是一个超全局数组,默认情况下它会合并 $_GET
、$_POST
和 $_COOKIE
的数据。但需要注意的是,$_REQUEST
是否包含 $_COOKIE
的数据取决于 PHP 的配置(php.ini
中的 variables_order
或 request_order
参数)。以下是具体说明和示例:
1. 默认行为
如果
php.ini
中的variables_order
包含C
(表示COOKIE
),则$_REQUEST
会包含$_COOKIE
的数据。默认的
variables_order
通常是GPCS
(即 GET、POST、COOKIE、SERVER),因此默认情况下$_REQUEST
会包含$_COOKIE
的数据。优先级顺序:
$_GET
>$_POST
>$_COOKIE
(同名键的值会被覆盖)。
示例:通过 $_REQUEST 获取 Cookie 数据
步骤 1:设置一个 Cookie
// 设置名为 "user" 的 Cookie,有效期为 1 小时
setcookie("user", "张三", time() + 3600, "/");
步骤 2:通过 $_REQUEST 读取 Cookie
// 直接访问 $_REQUEST['user']
$user = $_REQUEST['user'] ?? '未知用户';
echo "当前用户:" . htmlspecialchars($user);
输出结果
当前用户:张三
2. 注意事项
(1) 依赖 PHP 配置
如果 php.ini
中 variables_order
未包含 C
(如设置为 GP
),则 $_REQUEST
不会包含 Cookie 数据。需检查配置:
; php.ini 配置示例(确保包含 C)
variables_order = "GPCS"
(2) 优先级问题
如果请求中存在同名参数(如 URL 中有 ?user=李四
),则 $_REQUEST['user']
会优先使用 $_GET
或 $_POST
的值,覆盖 Cookie 的值:
// 假设 URL 为:http://example.com?user=李四
// $_REQUEST['user'] 会是 "李四",而非 Cookie 中的 "张三"
3. 安全问题(不推荐使用 $_REQUEST)
$_REQUEST
虽然方便,但会混合不同来源的数据,存在以下风险:
变量覆盖:攻击者可能通过 GET/POST 覆盖 Cookie 中的敏感值。
来源不明确:无法确定数据来自 GET、POST 还是 Cookie,降低代码可维护性。
安全隐患:若未充分过滤,可能导致 XSS 或 CSRF 漏洞。
推荐做法
明确使用 $_GET
、$_POST
或 $_COOKIE
获取数据,避免混淆:
// 明确从 Cookie 中获取数据
$user = $_COOKIE['user'] ?? '未知用户';
完整示例
<?php
// 设置 Cookie
setcookie("user", "张三", time() + 3600, "/");
// 通过 $_REQUEST 读取 Cookie(需确保 php.ini 配置正确)
$user = $_REQUEST['user'] ?? '未知用户';
echo "当前用户:" . htmlspecialchars($user);
?>
总结
$_REQUEST
可以获取$_COOKIE
数据,但需 PHP 配置支持(variables_order
包含C
)。不推荐依赖
$_REQUEST
,应明确使用$_GET
、$_POST
或$_COOKIE
。始终对用户输入进行过滤和验证(如使用
htmlspecialchars()
或filter_input()