ThinkPHP8废除全局过滤机制,所有输入输出须按上下文手动防护:HTML文本用htmlspecialchars,属性值需ENT_QUOTES,JS内联用json_encode,富文本用HTMLPurifier。

ThinkPHP8不再提供全局自动过滤机制,PHP原生的addslashes或magic_quotes_gpc等历史方案已被废弃,所有输入必须按上下文手动防护,否则直接暴露XSS、SQL注入风险。
TP8彻底移除default_filter配置项
在config/app.php中设置'default_filter' => 'htmlspecialchars'已无效,框架启动时会静默忽略该配置。这与PHP 5.4之前依赖magic_quotes_gpc、或TP5.x允许全局过滤的模式完全不同。
【旧代码中残留的filter参数如input('name', 'htmlspecialchars')仍可运行,但仅作用于单次取值,不构成安全兜底】。
试图靠这一行代码覆盖全部输出场景,会导致HTML属性、JS内联、富文本等上下文全部失守。
立即学习“PHP免费学习笔记(深入)”;
PHP层面的过滤能力被严格限定在具体上下文
方法一:HTML文本内容输出必须用{:htmlspecialchars($var, ENT_QUOTES | ENT_HTML5, 'UTF-8')},不能只写{$var}——TP8模板引擎默认不转义任何变量。
方法二:HTML属性值必须包裹在引号内,并确保内容已按属性上下文编码,例如title="{:htmlspecialchars($title, ENT_QUOTES, 'UTF-8')}";若漏掉ENT_QUOTES,单引号会被截断并注入onclick事件。
方法三:JS字符串内联严禁使用htmlspecialchars,必须改用json_encode($data, JSON_UNESCAPED_UNICODE | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_QUOT),否则反斜杠和引号会破坏JS语法结构。
TP8强制要求按输出位置选择不同过滤函数
第一步:识别当前输出位置——是普通段落?是img标签的alt属性?是<script>里的变量赋值?还是富文本编辑器提交的内容?</script>
第二步:匹配对应防护方式——HTML文本→htmlspecialchars;HTML属性→htmlspecialchars+ENT_QUOTES;JS内联→json_encode;富文本→HTMLPurifier白名单净化。
第三步:验证是否遗漏上下文——比如AJAX返回JSON数据给前端Vue组件渲染,此时后端PHP不做任何过滤,过滤责任移交至前端v-html指令前的sanitize-html库,TP8不干涉也不兼容该流程。
这一步操作起来很简单,直接把文件拖进去就行。



















