在ThinkPHP6中间件中应优先使用$request->param()获取混合参数,注意路由变量优先、POST覆盖GET;需精准控制来源与类型时用input()并指定后缀;JSON请求须手动解析;文件上传必须通过$request->file()获取并严格校验扩展名。

在ThinkPHP6中间件中安全、准确地获取请求参数,是实现权限校验、日志记录、参数预处理等逻辑的前提,不能依赖原始超全局变量或错误调用方式,否则会漏取、误取甚至引发类型错误。
用Request对象的param()方法获取混合参数
param()是框架推荐的通用方式,它自动合并当前请求类型的参数(GET/POST/PUT等)、路由变量和URL查询参数,且路由变量优先级最高。
在中间件handle方法中直接调用:$request->param('token')。
这一步操作起来很简单,直接写就行,但要注意:如果前端同时通过URL传?id=123又在POST体里传id=456,param('id')返回的是456(POST优先),不是123。
若需强制只取GET参数,改用$request->get('id');只取POST则用$request->post('name')——混用param和get/post时务必确认来源意图,否则逻辑可能被绕过。
用input()函数精准指定来源与类型
input()比param()更底层、更可控,适合需要明确来源、默认值、类型转换或过滤的场景。
方法一:指定来源和类型转换
例如input('user.id/d', 0)表示从任意来源取user[id]并转为整型,非法值返回0;漏写/d后缀会导致字符串被原样返回,后续做数值比较时可能出错。
方法二:限定仅从POST取值input('data/a', [], 'htmlspecialchars')表示只从POST中读取data字段,声明为数组类型,且对每个元素执行htmlspecialchars过滤。注意:如果前端实际传的是JSON字符串而非表单数据,这个调用会返回空数组,因为input()不解析请求体中的JSON。
【必须手动解析JSON请求体才能用input()取到】:当Content-Type为application/json时,需先调用$request->getContent()拿到原始JSON字符串,再用json_decode()解析,否则input()完全无法读取。
在中间件中安全获取文件上传参数
input()函数对文件字段无效,所有文件信息必须通过$request->file()或request()->file()获取。
第一步:检查是否存在上传文件$file = $request->file('avatar');
第二步:验证文件合法性
调用$file->isValid()判断是否为真实上传文件,避免伪造路径攻击。未校验就直接移动文件可能导致任意路径写入。
第三步:移动文件前确认扩展名白名单
用$file->getOriginalExtension()获取原始后缀,禁止使用$file->getExtension()——后者可被恶意构造的Content-Type欺骗。
这一步不能跳过,否则攻击者可能上传.php文件并触发远程代码执行。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











