允许自定义样式的位置,为什么连样式内容也要过一遍过滤
允许用户自定义样式的位置,为什么连样式内容也要过一遍过滤?因为样式不是纯表现层的描述文本:属性名和取值都可以指向外部资源、可以改变页面元素的呈现,也可以把可见内容换成另一套。WordPress 官方在本轮安全修复清单里列出了 Author 及以上角色通过绕过安全样式属性过滤器实现 CSS injection 的问题,处理方向是对样式内容本身做白名单过滤,而不是只检查它能不能被解析。
样式里能藏什么
常见的三类。一类是引用外部地址的属性取值,页面会把请求发给站点之外的服务;一类是覆盖布局的取值,可把已有内容遮挡或替换,影响访客看到的正文;一类是与脚本行为联动的写法,通过改变元素可见性影响页面交互。三类都不需要写脚本标签,却都能改变访客的实际体验,这正是「只过滤标签不足以拦住样式注入」的原因。
白名单过滤器为什么会被绕过
过滤要同时看三段:选择器、属性名、属性取值。只放开属性名而不限取值,取值里就能带外部地址;只检查取值字面,编码变形与拼接写法就可能绕开;只看当前提交的文本,落库后再与其他片段拼接同样能拼出未放开的写法。
因此口径是「双重白名单加落库前复核」:允许的属性名与允许的取值形式分别列清单,写入前再按合并后的最终文本核一次。这与富文本的内容过滤是同一套思路,只是对象从标签换成了样式。
过滤要覆盖的三段内容
一是结构与语义层。站内的敏感词过滤与关键词替换处理文本内容,内容审核处理发布前的把关,样式过滤要与之并列,不能被视为已被富文本过滤器顺带解决。二是身份与认证层。后台入口的 JWT 认证负责判断请求来自谁,与「这个人提交的样式是否安全」是两个问题。三是防采集与干扰码这类出站处理,它们改变正文渲染,但不改变样式过滤的判断对象。
站内还有面向脚本注入与数据库注入的防护,样式过滤属于同一套内容安全边界里的一个环节,缺少它时,其他层做得再严也会从这个入口留出缝隙。
谁能写自定义样式
暴露面由角色决定。可写自定义样式的角色范围越宽,过滤规则要越严格;如果只有站点管理员能改,仍建议保留过滤,防止被复用到批量导入或模板内容里。AnQiCMS 提供可视化模板编辑能力,模板与样式的修改在授权角色手里是常规操作,这类位置的改动同样应走同一套过滤与审核口径,而不是因为「是管理员写的」而跳过。
官方修复清单里的这条问题面向 Author 及以上角色,说明「可信角色」并不是免检条件;发布说明同时提醒只有较新版本处于活跃支持中,把这类修复留在旧版本之外会持续暴露。
问:能不能直接关掉自定义样式入口? 答:可以,这是最省事的处置。业务确实需要时,再按双重白名单与最终文本复核两步放开。
问:管理员写的样式也过滤会不会误伤? 答:会有需要放开的正常写法,做法是把确认安全的属性与取值补进白名单,而不是对整个角色跳过过滤。
问:模板文件里的样式要不要走同样检查? 答:模板属于代码层,一般由部署流程控制;对外表单里可提交的样式片段才需要运行时过滤,两者的控制手段不同但判断口径应当一致。