首页/安全/渗透测试与安全评估速查/XSS 修复视角:输出编码与 CSP
常见漏洞验证121 条

XSS 修复视角:输出编码与 CSP

按输出上下文选择编码规则(HTML/属性/JS/URL 各自不同),配合 CSP 与框架默认转义,避免自写正则过滤。

XSS 的修复视角

XSS 的根因是把不可信数据放进了会被解释执行的上下文,修复的关键是按输出位置选择对应的编码规则:HTML 正文、属性值、脚本内部、URL 参数各自不同,用一种通用编码覆盖全部上下文仍会留下注入点。配合内容安全策略与框架默认转义,可以显著降低残余风险。

基本信息

编码原则按输出上下文选择实体编码规则
富文本走白名单过滤,不允许任意标签与属性
内容安全策略收紧脚本来源,避免放行内联脚本
框架用法使用模板引擎默认转义,禁用原始 HTML 渲染开关
常见误区自写正则做黑名单过滤,容易漏掉变体

典型使用场景

  • 用户昵称、评论、站内信等回显内容的编码处理
  • 查询参数回显在页面标题与面包屑中
  • JSON 数据内嵌到脚本上下文时的序列化处理
  • 跳转链接参数与图片地址的属性值编码
  • 富文本编辑器内容的标签与属性白名单过滤

内容安全策略响应头示例

内容安全策略响应头示例
# 只允许同源脚本,禁止插件对象与基础路径篡改
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self'" always;
# 配合模板引擎默认转义,不要为了省事关掉自动转义

上下文与编码读法

输出位置编码要求常见错误
HTML 正文实体编码尖括号与引号只过滤脚本标签,事件属性仍可注入
属性值实体编码并始终加引号不加引号导致空格后新属性被拼接
脚本内部使用序列化输出,避免字符串拼接直接把数据拼进脚本变量
URL 参数做 URL 编码并校验协议只编码空格,未限制协议类型
内容安全策略是纵深防御而不是修复手段:编码修复后仍应保留策略,用于降低遗漏点的实际影响。
框架默认转义是最省力的防线,只有在确有富文本需求时才开启原始渲染,并配白名单过滤。

易错点

  • 全站共用一种编码函数,属性与脚本上下文仍可注入
  • 内容安全策略中保留内联脚本放行,策略效果大幅削弱
  • 用正则黑名单过滤标签,忽略大小写与编码变体绕过
  • 为支持富文本直接关闭自动转义,未配套白名单过滤

数据来源与参考

  • OWASP XSS Prevention Cheat Sheet
  • W3C Content Security Policy Level 3
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌