tp5.0/5.1在application/config.php、tp6.x在config/app.php中配置'default_filter'项,值为逗号分隔的函数名(如'htmlspecialchars,trim'),仅对input()、param()等request方法获取的数据生效,不作用于$_get、路由变量等直接访问。

全局过滤器不是“开个开关就完事”,它只对通过 input()、param()、get()、post() 等 Request 方法获取的数据生效;直接读 $_GET 或 $request->get()['q'] 会完全绕过它。
全局过滤器在哪配?配置项叫什么
TP5.0/5.1:在 application/config.php 中设置 'default_filter' => 'htmlspecialchars,trim';TP6.x 则移至 config/app.php,字段名不变。多个函数用英文逗号分隔,顺序即执行顺序。
- 函数必须是 PHP 内置函数或已加载的自定义函数(如
strip_tags、intval),不能带括号 - TP6 默认不启用任何过滤,TP5 默认是
'htmlspecialchars',但很多老项目会覆盖掉 - 配置后,所有
$this->request->param('name')、input('name')返回值都会自动经过这些函数处理
为什么 htmlspecialchars 后还可能 XSS?
因为 htmlspecialchars 只转义 HTML 特殊字符,不处理 JavaScript 事件属性、CSS 表达式、URL 协议(如 javascript:)、或富文本中的合法标签。它适合输出到 HTML body,但不适用于:href、src、onerror 等属性上下文。
- 若参数用于拼接 URL,需额外用
urlencode() - 若用于 JS 字符串,需用
json_encode($value, JSON_UNESCAPED_UNICODE)输出 - 若用于 HTML 属性值,确保引号闭合且值被
htmlspecialchars($value, ENT_QUOTES)处理 - 富文本场景必须用专用库(如 HTMLPurifier),不能依赖
default_filter
中间件里手动过滤和全局配置冲突吗
不冲突,但容易重复或错位。全局过滤在 Request 层统一执行;中间件里再调 $request->param() 拿到的已经是过滤后的值——你再 filter 一次,可能把 < 又变成 ,造成双重编码。
- 中间件适合做「全局过滤做不到的事」:比如只清洗某几个字段(
title、content),或做 base64 解码、JSON 解析等非标准转换 - 中间件里避免调
$request->withParam()修改参数后再进控制器——TP6 的Request是只读快照,改了也无效;应改用$request->only(['title', 'content'])提取后单独处理 - 真正该用中间件的,是那些绕过
input()的硬编码访问,比如直接读$_GET['q']或$request->get()['q']
最常被忽略的一点:全局过滤器对路由变量(如 user/:id 中的 $id)默认不生效——$id 进控制器时仍是原始字符串,哪怕你配了 default_filter。必须在控制器里显式 cast 或用验证器校验类型。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











