最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
TP8.0 实现 API 接口参数的白名单过滤机制 安全
时间:2026-07-10 10:09:52 编辑:袖梨 来源:一聚教程网
ThinkPHP 8.0需通过allowField()字段白名单、Validate双重校验及ParamWhitelistMiddleware中间件三重防护拦截非法参数:先用allowField()限定入库字段,再用验证器场景与规则校验字段存在性及内容安全,最后由前置中间件统一校验请求参数键名合法性。
需要让ThinkPHP 8.0的API接口只接收明确允许的参数字段,防止攻击者通过提交非法字段(如id、status、is_admin)绕过业务校验直接写入数据库,造成越权或数据污染。
用模型allowField()做字段级白名单拦截
第一步:在控制器中实例化模型后,立即调用allowField()并传入预设字段数组,例如$user = new User(); $user->allowField(['username', 'email', 'mobile'])->save($data);
第二步:确保白名单数组来自可信来源——不能直接用$_POST或$request->param()原始数据拼装,必须从配置文件读取或数据库查出后经清洗验证;【数据库查出的字段若含空格、换行或重复项,allowField会静默失效】
第三步:检查字段是否真实存在于当前数据表结构中,执行(new User())->getSchema()->getFields()获取合法字段列表,过滤掉白名单里不存在的字段名。
这一步操作起来很简单,直接把文件拖进去就行。
结合Validate验证器做字段存在性+规则双重白名单
方法一:在验证器类的$scene定义中显式列出该场景下允许出现的所有字段名,漏写=不校验也不保证存在。例如register场景必须写protected $scene = ['register' => ['username', 'email', 'mobile']];
方法二:在验证规则中为每个字段绑定filter,如'username' => 'require|alphaNum|htmlspecialchars',避免字段存在但内容危险。
注意:validate校验通过后,仍需配合allowField()二次过滤——因为验证器不管字段是否入库,只管规则;而allowField()管入库字段,不管内容安全。
通过中间件统一拦截非法参数键名
创建ParamWhitelistMiddleware中间件,在handle方法中获取$request->param()结果,遍历所有键名,比对预设白名单数组,发现非法键名立即抛出400异常并终止请求。
白名单数组建议从config/api.php中读取,例如'allowed_params' => ['page', 'limit', 'sort', 'keyword'],避免硬编码在中间件内。
这一步必须放在app/middleware.php全局中间件数组最前面,否则路由分发后参数已进入控制器,拦截失去意义。
相关文章
- 猫王小黄鸭 07-21
- 日落海滩时尚人像 07-21
- iOS哔咔网页版入口-哔咔漫画iOS网页版入口 07-21
- 高级定制时装风暴巨片 07-21
- 卧室抓拍人像生活方式 07-21
- 影棚电影级时尚肖像 07-21