如何使用ThinkPHP进行请求参数签名以防止参数篡改?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1108个文字,预计阅读时间需要5分钟。
在ThinkPHP 6中,推荐使用中间件(Middleware)来实现签名验证,这不仅是因为其更高级的特性,更重要的是中间件能够自然地截获所有请求,而不依赖于控制器是否继承自特定基类或是否存在校验逻辑的遗漏。简而言之,使用中间件进行签名验证可以确保在业务逻辑执行前完成验证,若验证不通过,参数可能已被篡改,从而参与运算。
常见错误现象:app\controller\User::update() 里手动调 checkSign(),结果 app\controller\Pay::notify() 忘了加,攻击者直接伪造回调参数绕过校验。
- 中间件能统一处理
GET、POST、JSON请求体,避免各处重复解析 - 若用 Controller,必须确保所有入口方法都调用同一套校验逻辑,且不能跳过
__construct()或前置钩子 - ThinkPHP 5.1 的
filter参数过滤机制不校验签名,仅做类型转换,别混淆
签名算法怎么选:md5 + secret 还是 hmac_sha256?
用 md5($params . $secret) 是典型错误——它无法防重放、易被长度扩展攻击,且 secret 若拼在末尾,攻击者可构造 param1=a¶m2=b%00...&sign=xxx 绕过(部分框架对 %00 截断)。
本文共计1108个文字,预计阅读时间需要5分钟。
在ThinkPHP 6中,推荐使用中间件(Middleware)来实现签名验证,这不仅是因为其更高级的特性,更重要的是中间件能够自然地截获所有请求,而不依赖于控制器是否继承自特定基类或是否存在校验逻辑的遗漏。简而言之,使用中间件进行签名验证可以确保在业务逻辑执行前完成验证,若验证不通过,参数可能已被篡改,从而参与运算。
常见错误现象:app\controller\User::update() 里手动调 checkSign(),结果 app\controller\Pay::notify() 忘了加,攻击者直接伪造回调参数绕过校验。
- 中间件能统一处理
GET、POST、JSON请求体,避免各处重复解析 - 若用 Controller,必须确保所有入口方法都调用同一套校验逻辑,且不能跳过
__construct()或前置钩子 - ThinkPHP 5.1 的
filter参数过滤机制不校验签名,仅做类型转换,别混淆
签名算法怎么选:md5 + secret 还是 hmac_sha256?
用 md5($params . $secret) 是典型错误——它无法防重放、易被长度扩展攻击,且 secret 若拼在末尾,攻击者可构造 param1=a¶m2=b%00...&sign=xxx 绕过(部分框架对 %00 截断)。

