ThinkPHP如何防止XSS蠕虫_富文本白名单过滤策略【详解】
ThinkPHP 6.x 防御 XSS 蠕虫:富文本白名单过滤的正确打开方式 说白了,用 htmlspecialchars() 处理富文本,那就是直接把编辑器给废了——所有标签被转义成普通文本,页面当然没法渲染。这根本不是防 XSS,这是自废武功。真正能在安全与可用之间找到平衡的,只有白名单式的 H
ThinkPHP 6.x 防御 XSS 蠕虫:富文本白名单过滤的正确打开方式
说白了,用 htmlspecialchars() 处理富文本,那就是直接把编辑器给废了——所有标签被转义成普通文本,页面当然没法渲染。这根本不是防 XSS,这是自废武功。真正能在安全与可用之间找到平衡的,只有白名单式的 HTML 净化方案。而在 ThinkPHP 6.x 的生态里,唯一靠谱的选择就是 HTMLPurifier。但请注意,它必须手动配置得死死的,默认配置?那等于在请 XSS 蠕虫进门。
我先说个核心判断:开箱即用的 HTMLPurifier::getInstance() 默认只允许极简标签组通行,连 都会被干掉,业务根本跑不起来。更危险的是,它默认留着 on* 事件、ja vascript: 协议、data: 协议、内联 style 表达式——这就等于是把门虚掩着,任由 XSS 蠕虫往里钻。

为什么直接调用 HTMLPurifier::getInstance() 会出事
你想啊,默认配置下它能放过什么?极简标签。可业务需要的 、、 这些都会被一刀切掉。但如果不加限制,XSS 蠕虫就能通过 onclick、onerror 这些事件属性,或者 ja vascript: 这样的协议,甚至 data: 这样的 URI 来执行恶意代码。
- 事件属性必须显式禁掉:
$config->set('HTML.Attr.EnableID', false)加$config->set('Core.RemoveScriptContents', true),缺一不可。 URI.AllowedSchemes只留['http', 'https', 'mailto'],ja vascript:和data:必须从列表里彻底清除。HTML.Allowed别偷懒写*或空字符串,要按需写死,比如:'p,b,i,u,strong,em,a[href|title|target],img[src|alt|width|height|class]'。- 开启
Core.RemoveInvalidTags和Core.EscapeInvalidChildren,否则畸形嵌套(比如)可能绕过解析器。
ThinkPHP 6 中如何让 clean() 真正生效
很多人在控制器里写 HTMLPurifier::clean($this->request->post('content')),觉得万事大吉了。但这是典型的假动作——它只清洗了一轮变量值,可后续调用的 input('content')、param('content')、验证器、日志、缓存键生成等所有地方,读到的仍然是原始未过滤数据。XSS 蠕虫只要找到任意一个漏网的输出点,就能自我复制并传播。
打个比方啊,这就像你给大门装了把锁,但所有窗户都大敞着。
- 必须封装成服务类(比如
app\common\service\PurifyService.php),然后用app('purify')->clean()统一调用,这样才能确保配置复用、单例缓存生效。 - 不要在中间件里对
$_POST做全局htmlspecialchars(),那会把富文本直接毁掉,JSON 接口也会直接 500。 - 如果要做全量参数净化,中间件里应该调用
$request->mergeParam(),把清洗后的数组合并进 Request 对象。注意,TP6.1+ 才支持这个操作;旧版需要反射修改$request->param属性。 - 验证器里别传原始
input(),先走app('purify')->clean()再校验,否则长度、格式等规则可能误判。
白名单配置里最容易被忽略的三个坑
在实际项目中,不少团队配完 HTML.Allowed 就以为万事大吉,结果上线后还是被绕过。真正的漏洞往往藏在属性细节和上下文处理里。
- 坑一:
img[src]不够,得加协议限制。 只用URI.HostBlacklist拦第三方图床还不够,最好自定义 Filter 检查src是否以http://、https://、/开头,否则src="data:image/png;base64,..."就能藏 payload。 - 坑二:
a[href]允许了,但没关HTML.SafeIframe? 那仍然能执行。如果业务需要嵌入视频,必须显式开启HTML.SafeIframe并配上URI.SafeIframeRegexp。 - 坑三:
style属性哪怕只允许color、font-size,也不够安全。 如果没关CSS.AllowImportant和CSS.Definition->addAllowedProperties,攻击者仍然可以用expression()或url(ja vascript:...)触发恶意代码。
白名单不是列几个标签就完事儿了。每一条允许的属性,都要问自己一句:它有没有执行能力?能不能带协议?会不会被畸形嵌套利用?XSS 蠕虫靠的就是这些“看起来安全”的缝隙自动扩散——这才是防御的关键所在。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















