输入过滤被绕过的公告从多年前的版本列到现在,老站怎么排处置顺序
Joomla 安全中心两条输入过滤绕过的公告,受影响版本都写成从很多年前的版本一路连到当前分支,修复版本则落在两条线上。老站该怎么排处置顺序?答案是按能不能升级来排,而不是按评级高低来排。这类区间给出的信号很直接:问题不是一次改动引入的,而是过滤层与解码层长期存在的理解差异,任何还在这条区间里的站点都在范围内。
区间从多年前写起,意味着什么
公告把范围写成两段:一段覆盖历史很长的分支,一段覆盖当前主版本。评级只给到中等,修复日期与公告列出日期不同,说明补丁在内部已经确认过一段时间。
对老站点来说,这个区间里有三个现实问题:所在分支是否有对应修复版本可用;升级是否会跨越较大的版本差异;以及即便有修复版本,站点里那些依赖旧过滤行为的自定义代码会不会跟着坏。第一个问题决定动作,后两个决定时间。
先判断能不能升,再判断要不要关
处置顺序的第一步是读取当前准确版本并对照修复版本。能升到对应修复版本的,按安全版本处理,走正常升级流程并留备份;这一类问题不需要停站,升级本身就是完整处置。
升不动的情况更常见,通常卡在版本跨度与自定义代码。这时应按暴露面排序:富文本输入、外部可提交的表单、以及会把用户内容原样输出到页面的位置,哪些能被外部触发,就先收窄哪一处。老站点常见的错误是先去做「加一层过滤」这类改造,把真正可控的动作——减少外部可写入的路径——放到后面。
过滤层和转义层不是一件事
绕过类型的公告最能说明这一点。两条分别涉及数据 URI 里的空白字符与实体解码不一致,两者都发生在「判断内容是否安全」这一层,判定与渲染对同一段内容的理解不同,绕过就出现在差异里。
自有系统的防护同样分两层:针对 SQL 注入与 XSS 的过滤、敏感词过滤与关键词替换处理的是输入与内容规则,属于判断层;输出时按上下文转义属于渲染层。把责任全压在第一层,等价于要求过滤逻辑准确预知所有渲染器的解析方式。老的富文本内容在升级后是否重新走一遍输出转义,是这类公告里更值得自查的点。
内容审核里要加的一条
除升级之外,老站点能立刻做的是把审核环节前移:富文本字段的外部写入路径要有限制,含脚本风险的提交内容先进人工或规则审核再落库。AnQiCMS 这类系统提供内容审核与敏感词过滤能力,用它把「谁可以写入富文本」和「写入后是否需要复核才发布」这两条规则显式化,比再加一层黑名单更稳。
需要强调的是,这一层不替代升级。它降低的是被写入的概率与影响面,过滤绕过本身要由修复版本解决。
常见问题
问:评级只是中等,能不能排到下个季度? 答:评级衡量影响范围,不衡量暴露面。对外可写入富文本的站点,处置时间应按入口而不是按评级定。
问:老站点在受影响区间内但没有修复版本可用怎么办? 答:先断外部写入路径,把站点的富文本改为只接受受信账号提交,同时把迁移排期当作处置的一部分,因为区间写这么长的分支通常不再获得长期维护。
问:升级后旧的富文本内容还要处理吗? 答:要抽查。历史内容里可能已经存在当时被判安全的写法,升级后解析行为变化会让它们显示异常,这部分应通过输出转义与一次内容复核解决。