XSS 过滤器绕过是怎么发生的,靠标签黑名单为什么不够

📅 2026-10-09 👁️ 0

安全公告里的「XSS 过滤器绕过」具体是怎么发生的?一句话概括:过滤器和浏览器对同一串文本的理解不一致。过滤器按自己的规则判断这段内容是否安全,浏览器按另一套解析规则决定要不要执行。绕过的做法就是构造出在这两套规则里答案不同的输入——在过滤器眼里是普通文本,在浏览器眼里成了可执行代码。Joomla 近期的两条 InputFilter 公告正对应这两类差异:一条涉及 HTML data URI 中的空白字符处理,一条涉及 HTML5 实体解码。

理解了这一点,就能回答第二个问题:为什么只做标签黑名单过滤仍然会被绕过——黑名单检查的是「这段文本长什么样」,浏览器执行的是「这段文本被解析成了什么」,两者之间永远存在解释空间。

绕过发生在哪一层

内容进入系统一般经过两道处理。入库时做过滤:把不允许的标签、属性、协议去掉或者改写;渲染时做转义:把内容按目标位置的语法规则重新编码。

黑名单过滤的问题出在它必须自己模拟浏览器的解析规则才能判断准确,而解析规则本身在不同上下文里不同。同一段文本放在元素内容里、属性值里、JavaScript 字符串里、URL 参数里,安全写法完全不一样。过滤器只有一份规则,渲染上下文却有多种,这个不对称就是绕过发生的位置。

data URI 与实体解码这两类差异都是典型例子:空白字符会不会被当成有效分隔、实体记法被解码成什么字符,过滤器和浏览器的答案不同,检查就形同虚设。

黑名单过滤的三个失效场景

第一是编码与记法变体。同一字符可以有多种写法,过滤器认得常见几种,浏览器却全部接受。第二是上下文切换。内容在属性、脚本、URL 之间被复用时,原本安全的写法在新的上下文里变成可执行。第三是解析差异。规范里允许浏览器做兼容处理的部分,正是过滤器最难覆盖的部分。

这三个场景有一个共同点:都不是靠「加几条黑名单规则」能补上的。规则越加越长,判断成本上升,漏判概率却不会明显下降,因为问题出在规则与解析器的差异上,不在规则数量上。

入库过滤与渲染转义的分工

职责要分清:入库过滤是内容治理手段,目的是让存下来的东西大体干净,便于展示和复用;渲染转义才是防注入的执行点,因为它按输出位置的语法要求重新编码内容,让数据不再被解释成代码。

正确的做法是把两者当两道不同的工序,而不是让前者替代后者。任何来自用户输入的内容——评论、留言、自定义字段、导入的正文——在渲染时都必须按所处上下文转义,无论它在入库时是否已经过滤过。

另一条边界同样重要:跨站脚本与 SQL 注入的防护手段不是一回事。SQL 注入靠参数化查询来挡,而不是关键词表;把两者混成一类「敏感内容检查」,通常是两条防线都没立起来。

内容安全设置该配的几件事

AnQiCMS 的内置防护里,敏感词过滤与关键词替换解决的是命中规则的内容如何处置,内容审核解决的是这条记录能不能对外露出,这两项属于内容治理,不能当成注入防护来理解。防采集干扰码面向的是批量复制,与执行安全无关。

真正需要逐项确认的是这些:表单与留言的写入口是否有校验;用户提交内容在后台列表里是否同样经过转义——待审核内容虽然不在前台展示,但后台审核时仍会被浏览器渲染,这一处最容易漏;富文本编辑器的产出在渲染时是否按上下文处理;静态页面的输出编码是否统一。

三层职责对照

层次 手段 目的 挡不住什么
入库过滤 标签与属性黑名单、敏感词过滤、关键词替换 让存储内容大体干净 解析差异型绕过
渲染转义 按输出上下文重新编码 让数据不被执行 逻辑本身的缺陷
参数化 查询与参数分离 阻断 SQL 注入 与脚本执行无关

常见问题

过滤器有没有必要保留?有。它能减少脏内容进入存储,降低展示层的处理压力,但要把定位说清楚:内容治理,不是安全边界。

怎么验证自己有没有这类风险?提交一批包含非常规记法、编码变体与不同上下文用法的测试内容,看前台与后台渲染时是否被原样执行。检查范围要包含待审核列表,攻击者可以故意提交、等待被查看。

升级补丁能替代转义吗?不能。补丁修的是特定解析差异,转义覆盖的是所有输出位置。

一个判断口径

看一个系统怎么对待用户提交的内容,就能判断它的注入防护水位:把安全寄托在「进来的东西已经过滤过」,还是寄托在「无论进来什么,输出时都按上下文重新编码」。前者是概率,后者是机制。

相关文章

Joomla 安全公告里的受影响版本区间从 1.5.0 起,说明什么

Joomla 安全中心近三条公告把受影响版本写成 1.5.0 至 5.4.8、6.0.0 至 6.1.3 这样的区间,修复日期统一为 2026-09-25。区间从很早的版本起,说明漏洞位于多年未变的公共代码里。本文拆解公告里受影响区间、修复日期、回移边界三个字段怎么读,并给出自家站的核对顺序:版本记录、备份点、升级窗口,同时说明 AnQiCMS 自身 v3.6.6 修复的两类问题。

2026-10-09

Web服务器里Nginx占了约三成,建站时这一层怎么选

按 W3Techs 在 2026 年 10 月的统计,Nginx 的使用率约三成,这一层早已是通用件,选型重点不该还放在「挑哪个软件」上。真正拉开差距的是配置面:静态资源交付方式、跳转与伪静态规则落在哪一层、代理超时与缓冲怎么设、来源地址怎么传递。本文说明为什么同一软件不同配置的差距远大于换软件,以及建站时这一层该核的四件事。

2026-10-09

上线前拿体验站跑五项检查,能看出一套CMS的哪些短板

试用演示站不该用来浏览界面,而该用来跑任务清单。五项检查依次是:内容结构能不能改,日常动作能不能批量,备份与恢复能不能真的回滚,接口覆盖的能力有多宽,AI 与自动化能力在后台的实际入口在哪里。这五项跑完,选型阶段看不出的短板会暴露出来,本文给出每一项的具体操作动作和判断标准。

2026-10-09

AI爬虫抓取量远大于回荐流量,这组对比对内容站意味着什么

抓取量与回荐流量的比衡量的是消耗与返还的落差,两者分母不同,抓取多并不等于能换回访客。第三方监测显示不同 AI 平台的爬取与回荐比率差异极大,个别平台的比值达到数千比一。内容站的应对不是简单放开或屏蔽,而是分别管理抓取授权与引用可见性。

2026-10-09

MFA 绕过公告盯上的是登录态,二次验证要不要一起查

认证绕过类公告反复盯住「记住登录状态」的 cookie,是因为这类长期票据把身份验证的结果保存了下来:风险不在口令,而在票据的签发与校验环节。Joomla 的 rememberme 绕过公告给出的受影响区间是 4.0.0 至 5.4.8 与 6.0.0 至 6.1.3,修复日期 2026-09-25。开了二次验证仍要检查有效期、撤销路径与凭证轮换,本文说明登录侧该配的三项控制。

2026-10-09

把后台地址写进 Disallow,为什么反而暴露了入口

抓取排除规则的作用是让爬虫不要收录某个地址,它不是访问授权,任何访客都能读到这份文件里列出的路径。把后台地址写进规则文件,等于公开交给抓取方一份入口清单。本文说明挡收录与挡访问的差别,以及后台入口真正该靠哪些控制收口。

2026-10-09

多语言站点用子目录还是子域名,抓取和维护怎么分

多语言站点用子目录还是子域名,要分两条线看:抓取侧关心的是各语言版本能否被独立发现与指向正确,维护侧关心的是配置份数与内容复用成本。本文给出两种结构的归属差别、语言切换要处理的两件事,以及整页翻译能力如何影响长期维护量。

2026-10-09

采集内容和自动写作放一起,会不会产出低价值页面

采集只搬运信息,不产生新增内容;自动写作能组织表达,但需要选题与事实来源支撑。两者直接串成流水线批量铺页,确实会放大重复与浅薄页面的比例,判断依据是信息增量而不是产量。本文给出三种产能来源的差别、上线前的抽检口径和审核配置该放在哪一环。

2026-10-09