php $_REQUEST 数据错误

本文探讨了在使用ThinkPHP 3.2框架时遇到的一个关于REQUEST数据获取的奇怪问题。具体表现为通过$_REQUEST获取的数据与前端传入的数据不一致的现象,并分析了可能的原因及解决方法。

陈永鹏的微博

陈永鹏的csdn博客地址:http://blog.youkuaiyun.com/chenyoper

陈永鹏的博客园地址:http://www.cnblogs.com/Yoperchen/


记录个奇怪的问题

在thinkphp3.2 通过REQUEST获取某数据的时候,一直跟前端传输过来的不一致。

且有个现象:

1.在入口文件中第一行打印$_REQUEST的数据是正确的。

2.在项目Controller文件中打印$_REQUEST则部分是跟 1 不一致。

这个不一致的值跟cookie的键是一样的,且收到的是同键名的cookie的值。


版本5.3以上,php.ini中有request_order属性来设置$_REQUEST。查了下php.ini, request_order设置成为了GPC(Get and Post cookie)。

G,P,C的先后顺序就是设置的array的覆盖顺序。但是即使这样,在入口文件和Controller文件一样打印(print_r($_REQUEST))也应是一致的。


查看了php.ini ,request_order="CGP"

也许是TP内部做了什么处理。

全局搜索了一下,框架中也没有去设置request_order的地方.


此问题留待探究.


但综上,直接采用POST 或GET 获取数据即可。





作者:陈永鹏

邮箱:chen.yong.peng@foxmail.com

转载请注明作者陈永鹏优快云博客地址:http://blog.youkuaiyun.com/chenyoper

零零糖


<think>嗯,用户给了一段PHP代码,看起来是关于处理用户输入的安全问题。首先,我需要仔细看看这段代码有什么问题或者需要注意的地方。让我先逐行分析一下。 首先,用户用了`$user = $_REQUEST['user'];`和`$pass = $_REQUEST['password'];`,然后直接通过`echo`输出了`$_REQUEST['user']`和`$_REQUEST['password']`。接下来,他们又用了`htmlspecialchars`函数来处理`$_REQUEST['username']`和`$_REQUEST['password']`,赋值给`$name`和`$password`。 这里有几个点需要注意。首先,`$_REQUEST`超全局变量包含了`$_GET`、`$_POST`和`$_COOKIE`的数据,所以使用它的时候要确保知道数据来源,避免安全风险。然后,用户直接回显了用户输入的数据,这可能导致XSS攻击,特别是如果这些数据被输出到HTML页面中的话。不过后面用了`htmlspecialchars`处理,这可以转义HTML特殊字符,防止XSS。不过注意到变量名可能不一致,比如`$_REQUEST['user']`和`$_REQUEST['username']`,这可能是拼写错误,会导致未定义的索引错误。 另外,密码处理方面,直接存储明文密码到变量中不安全,应该使用密码哈希函数如`password_hash`来加密。而且,变量命名方面,`$pass`和`$password`可能混淆,建议统一命名。还有,在输出用户输入前没有进行过滤,虽然后面用了`htmlspecialchars`,但前面的`echo`直接输出可能存在风险,应该确保所有输出都经过转义。 总结下来,主要问题包括变量名不一致、XSS漏洞风险、密码处理不安全、使用`$_REQUEST`可能存在的数据来源不确定性,以及未进行输入验证。需要指导用户如何修正这些问题,比如统一变量名,始终使用`htmlspecialchars`转义输出,使用`password_hash`处理密码,优先使用`$_POST`或`$_GET`明确数据来源,以及添加输入验证等。</think>让我们逐步分析这段PHP代码并指出需要注意的安全问题和改进方案: $\boxed{代码分析}$ 1. 变量名不一致问题 - 第一行使用`$_REQUEST['user']` - 第四行使用`$_REQUEST['username']` - 这里存在变量名不一致的拼写错误,会导致未定义的索引错误 2. XSS漏洞风险 - 直接输出用户输入:`echo $_REQUEST['user']` - 正确做法应始终使用:`echo htmlspecialchars($_REQUEST['user'])` 3. 密码处理问题 - 将密码明文存储在变量中:`$pass = $_REQUEST['password']` - 建议使用密码哈希函数: ```php $password_hash = password_hash($_REQUEST['password'], PASSWORD_DEFAULT); ``` $\boxed{安全改进方案}$ 1. 统一变量命名 ```php $username = $_REQUEST['username']; $password = $_REQUEST['password']; ``` 2. 输出转义规范 ```php echo htmlspecialchars($username, ENT_QUOTES, 'UTF-8'); echo htmlspecialchars($password, ENT_QUOTES, 'UTF-8'); ``` 3. 输入验证加强 ```php if (!isset($_REQUEST['username']) || empty(trim($_REQUEST['username']))) { die("用户名不能为空"); } ``` $\boxed{最佳实践建议}$ 1. 优先使用明确请求方法 ```php // 使用POST方式获取 $username = $_POST['username'] ?? ''; ``` 2. 密码安全处理 ```php if (password_verify($input_password, $stored_hash)) { // 验证通过 } ``` 3. 使用过滤器验证输入 ```php $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL); ``` $\boxed{最终安全代码示例}$ ```php // 接收并验证输入 $username = htmlspecialchars($_POST['username'] ?? '', ENT_QUOTES, 'UTF-8'); $password = $_POST['password'] ?? ''; // 密码哈希处理 if (!empty($password)) { $password_hash = password_hash($password, PASSWORD_DEFAULT); } // 安全输出 echo "用户名:" . $username; // 密码不应回显到页面 ``` $\boxed{关键安全要点}$ 1. 所有用户输入都应视为不可信数据 2. 输出时始终使用htmlspecialchars()转义 3. 密码必须使用password_hash()加密存储 4. 推荐使用PHP过滤器函数验证输入格式 5. 避免混用$_REQUEST,明确指定$_GET/$_POST
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值