内容被第三方嵌入卡片时带来的跨站脚本,站里该在哪一层清洗
文章里插入的第三方视频和图片卡片带来的跨站脚本,应该在发布前清洗还是在前台渲染时挡?答案是两层都要,因为嵌入卡片和作者手写的正文不是同一类风险,不能只在一个层清洗。同行系统 WordPress 在 2026 年 10 月 6 日发布的安全维护版本里,就列了一条「Imgur 嵌入存在跨站脚本(XSS)」的修复。结论可以这样落:嵌入内容由外部服务生成,它绕过的是普通字段过滤,所以只做前台转义不够;而只在发布前审,也拦不住外部服务日后改变返回内容。合理的做法是三层分工——采集入库时限来源、发布前审标记、前台输出时按白名单放行。
嵌入卡片里的脚本是从哪一步进来的
普通富文本的输入是站点自己的作者,而嵌入内容的输入是外部服务。链路上有三个节点都可能引入脚本:
第一步是取回阶段。站点用地址去请求对方的嵌入接口(oEmbed 一类机制),拿回一段由对方决定内容的标记。写进数据库的已经不是作者敲的那串字符。
第二步是渲染阶段。返回的标记里常带脚本、事件属性与跨域资源引用;浏览器执行它时,上下文是当前站点,因此它可以读页面状态、提交请求。这就是跨站脚本的执行面。
第三步是变化。外部服务今天的返回是干净的,不代表半年后仍然如此;嵌入类风险的特点是内容不在站点控制内,审查只在入库那一刻做过,就等于把长期有效**给了别人。
这三步解释了为什么「作者没写脚本」不构成安全依据:脚本不来自作者,而来自主体之外的返回。
只靠前台转义为什么不够
转义解决的是「把标记当文本显示」。如果对嵌入内容整体转义,卡片就不可能渲染成视频或图片,功能直接消失;如果放行嵌入标记,就等于在输出层开了一个例外口子,而这个口子的大小取决于放行哪些标签与属性。
常见的两个失效写法:一是把例外做成「整段富文本都不转义」,作者正文与嵌入标记同时失去保护;二是按域名整体放行,忽略了被放行域名也可能被滥用或返回带脚本的标记。输出层的正确姿势是白名单粒度落在标签与属性上,而不是落在「这是嵌入内容」这个来源类别上。
发布前的内容审核和敏感词过滤分别看什么
两层职责不同,容易混用。敏感词过滤与关键词替换处理的是文本层面的违规内容,属于内容与合规维度;内容审核处理的是这条内容能不能发布,可以包含「是否包含脚本、来源是否受控」这类安全检查。
AnQiCMS 在这两层都有后台能力:内容安全设置支持敏感词过滤与关键词替换、内容审核;安全机制上内置 JWT 认证、内容敏感词过滤与防采集干扰码,用于防御 SQL 注入与 XSS 攻击。嵌入类内容落地到这套机制时的分工建议是:在内容审核规则里加一条针对标记的检查项(是否存在脚本标签、事件属性、异常跨域资源),把它和「敏感词」分开维护,因为两者的判定对象不同。
站内三层防护怎么落,自查顺序是什么
按数据流从上到下排:
采集入库层。AnQiCMS 支持内容采集,可以从其他网站自动采集内容;这一层的收口点是来源与字段范围——采回来的正文里带脚本标签的部分要按白名单清洗,而不是原样入库。批量采集比手工粘贴更容易把外部标记整段带进来,风险面更大。
发布前层。用内容审核拦住含未受控标记的内容,敏感词过滤与关键词替换处理文本违规。此层适合做「拒绝并说明原因」,因为它在人工流程上,不打断前台访问。
前台输出层。按标签与属性白名单放行嵌入标记,其余转义。同时保留防采集机制:AnQiCMS 的防采集干扰码用于保护内容不被批量抓取,它处理的是另一类问题(内容被成批拿走),不能替代脚本清洗,但可以和输出层一起配置。
自查顺序建议四步:
- 取一篇带嵌入卡片的旧文章,查看数据库里存的原始标记,确认脚本来自入库内容还是当次外部请求。
- 用一段带事件属性的标记做发布测试,看审核与过滤是否拦住,以及拦截发生在哪一层。
- 检查输出层放行范围,确认例外只覆盖受控嵌入标记,而不是整段富文本。
- 抽查采集功能的入库结果,确认批量采集的内容同样经过清洗。
常见问题
能不能直接禁止嵌入内容? 可以,这是最省心的选项:只允许图片与视频走站点自己的素材库。代价是文章里的外部视频要靠截图加链接说明替代。
只升级到最新版本够吗? 版本修的是具体的嵌入实现问题,嵌入内容带来的整体风险面还在:外部服务改变返回、新增来源域名,都不在补丁覆盖范围内。分层控制仍然要做。
前台加内容安全策略(CSP)算哪一层? 属于输出层之外的兜底手段,用于限制脚本来源与执行能力。它能降低利用成功率,但不改变「未经清洗的标记已经存进数据库」这个事实,仍要在入库与发布层清洗。
怎么判断已经出过事? 看两类痕迹:正文里出现不属于任何嵌入语法的外链脚本地址,以及前台页面上出现非预期的跳转或弹层。发现后按采集入库、发布前、输出层三段依次回查。