最有效防范 xss 攻击的方式是在 nginx 中用 add_header 配置 content-security-policy(csp)并加 always 参数,配合 x-content-type-options、x-frame-options 和 referrer-policy 等基础安全头形成纵深防御,x-xss-protection 已被主流浏览器弃用,不应依赖。

防范 XSS 攻击不能只靠一个响应头,Nginx 中最有效的方式是用 add_header 正确注入 Content-Security-Policy(CSP),再配合几个基础安全头形成纵深防御。X-XSS-Protection 已被主流浏览器弃用,仅作兼容参考,不可依赖。
优先配置 CSP:唯一现代有效的 XSS 防御机制
CSP 是当前浏览器支持的最强 XSS 防御手段,它通过声明式策略限制脚本、样式、图片等资源的加载来源。Nginx 可用 add_header 注入,但必须注意:
- 放在
server或location块中,http块下无效 - 必须加
always参数,否则 404、500、重定向等响应不带该头 - 后端应用(如 Spring Boot、Django)需关闭自行输出的 CSP,避免冲突
- 简单全局策略易破坏功能,推荐从
Content-Security-Policy-Report-Only模式起步,收集真实违规后再收紧
示例(报告模式,适合上线初期):
add_header Content-Security-Policy-Report-Only "default-src 'self'; script-src 'self' 'unsafe-inline' https:; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; connect-src 'self' https:; report-uri /csp-report;" always;配套基础安全头必须加 always
这些头虽不直接防 XSS,但能堵住常见绕过路径,且与 CSP 协同生效:
-
add_header X-Content-Type-Options "nosniff" always;:阻止浏览器 MIME 嗅探,避免.txt文件被当作 JS 执行 -
add_header X-Frame-Options "SAMEORIGIN" always;:防点击劫持,避免攻击者把你的页面嵌进恶意 iframe 干扰用户行为 -
add_header Referrer-Policy "no-referrer-when-downgrade" always;:减少敏感路径在 Referer 中泄露
注意:X-Frame-Options 虽被 CSP 的 frame-ancestors 覆盖,但保留它可兼容旧版浏览器。
关于 X-XSS-Protection:了解即可,不建议启用
Chrome、Firefox、Edge 等自 2023 年起已完全忽略该头。无论你配置 "1; mode=block" 还是 "0",都无实际防护效果。
- 若为兼容极老客户端(如 IE11),可保留,但不要把它当作 XSS 防御主力
- 配置时务必加
always,否则错误页缺失该头会暴露逻辑缺口 - 现代项目应移除该头,把精力集中在 CSP 和输入/输出编码上
关键细节:nonce 与动态策略不能只靠 Nginx
想严格禁止内联脚本('unsafe-inline'),必须用 nonce 机制:
- Nginx 本身无法生成随机 nonce,需后端每次响应时生成并注入 HTML 的
<script nonce="xxx"></script>标签 - 同时 Nginx 在响应头中同步写入:
add_header Content-Security-Policy "script-src 'self' 'nonce-xxx'" always; - nonce 值必须每次不同、base64 编码、且生命周期仅限单次请求
- 切勿硬编码或复用 nonce,否则策略形同虚设
静态资源(JS/CSS/图片)和 API 接口也需单独考虑:对 /api/ 路径可限制 script-src 'none',进一步缩小攻击面。











