首页/安全/漏洞与攻击面速查/XSS 防护清单与富文本处理
Web 漏洞原理与防护55 条

XSS 防护清单与富文本处理

实践中的 XSS 防护分三层:默认转义、必要时的输入净化(富文本白名单)、运行期缓解(CSP 与 HttpOnly);只做其中一层不足以覆盖全部入口。

漏洞与攻击面速查安全更新于 2026-10-13

XSS 防护清单是什么

实践中的 XSS 防护分三层:默认转义、必要时的输入净化、运行期缓解。默认转义指模板引擎与前端框架在输出位置自动编码,这是覆盖面最广的一层;输入净化只用于确实需要保留 HTML 的场景,例如富文本编辑与 Markdown 渲染,必须用白名单库限定标签与属性;运行期缓解包括 Cookie 的 HttpOnly 标志与内容安全策略,它们不修复注入点,但能把单点问题的影响范围压小。三层叠加后,即使某一层出现遗漏,攻击也未必能落地。

基本信息

防护层次默认转义、输入净化、运行期缓解
默认转义范围模板引擎与前端框架的插值位置
净化适用场景富文本、Markdown、允许保留格式的提交内容
净化方式标签与属性白名单,禁用内联事件与危险协议
运行期缓解Cookie 加 HttpOnly 与 SameSite、部署内容安全策略
验证要求覆盖页面、JSON 接口、导出文件与邮件模板等多个出口

典型场景

  • 普通表单与列表展示:依赖模板引擎默认转义即可覆盖
  • 富文本编辑器内容:需要白名单净化后再存储与展示
  • 单页应用从接口取数据插入 DOM:注意显式绕过接口
  • 后台运营查看用户提交内容:管理员会话权限高,需重点防护
  • 导出文件与邮件模板:同样属于输出位置,转义规则独立
  • 第三方内容嵌入:评估来源可信度并加策略限制

三层防护要点

三层防护要点
1. 输出层:模板引擎默认转义开启(Jinja2 autoescape、Thymeleaf 等)
2. 富文本:服务端用白名单库净化(标签与属性白名单)
3. 缓解层:会话 Cookie 加 HttpOnly;部署 CSP;敏感页面禁止被嵌套
4. 前端:避免 innerHTML 与 eval 类接口处理不可信数据
# 净化只在存储与展示链路做一次是不够的:展示位置不同,编码规则不同

CSP 响应头示例

CSP 响应头示例
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'none'" always;
# 上线前先用 Content-Security-Policy-Report-Only 收集违规来源
# 严格策略可能影响第三方统计与客服脚本,需与业务方确认清单

防护层与作用范围

层次手段能防住什么
默认转义模板与框架自动编码绝大多数插值位置的注入
输入净化白名单标签与属性富文本场景下的恶意标记
Cookie 标志HttpOnly 与 SameSite脚本读取会话与跨站自动携带
内容安全策略限制脚本与资源来源内联脚本执行与外部脚本加载
框架嵌套控制禁止被其他站点嵌套点击劫持类风险
内容安全策略可先用 Report-Only 模式收集违规报告,确认没有误杀后再切换强制模式。
富文本净化的白名单要定期复核:编辑器升级后可能新增标签与属性需求,宽松处理会悄悄放大风险。

易错点

  • 富文本用黑名单过滤(去 script 标签):畸形标签与事件属性仍可执行,应使用白名单净化库
  • 只做输入净化不做输出编码:同一份数据在不同输出位置的编码规则不同,必须两端配合
  • Cookie 未设 HttpOnly:脚本可通过读取会话进一步扩大影响
  • 内容安全策略直接上强制模式:可能误伤业务脚本,应先报告模式观察
  • 忽略 JSON 接口与导出文件:这些出口同样会被下游渲染,需纳入防护范围
  • 净化库配置长期不更新:库版本与新标签支持情况会变化,需要按周期复核白名单

数据来源与参考

  • OWASP XSS Prevention Cheat Sheet
  • W3C CSP Level 3 规范
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌