应配置 x-xss-protection: 1; mode=block,因其强制启用浏览器 xss 过滤器并在检测到反射型 xss 时阻断渲染,兼容 ie8+ 和 chrome 10–77;需显式设置以覆盖用户禁用、mime 类型绕过等失效场景;tomcat 可通过全局 valve、web.xml filter 或代码 setheader 三种方式配置;禁用 0 和纯 1,弃用 report=;须配合 csp 实现纵深防御。

推荐使用 X-XSS-Protection: 1; mode=block 配置,它能强制启用浏览器内置的 XSS 过滤器,并在检测到反射型 XSS 时直接阻断页面渲染,而非仅清理脚本——这对 IE8+、Chrome 10–77 等旧版浏览器仍有效,是兼顾兼容性与防护强度的务实选择。
为什么必须显式配置(而不是依赖默认)
虽然部分旧浏览器(如 IE8、Chrome 早期版本)默认开启 XSS 过滤,但该行为受以下因素干扰:
- 用户可手动禁用浏览器 XSS 过滤器(例如 IE 的“启用 XSS 筛选器”选项被关闭);
- 某些响应内容类型(如 text/plain 或非 HTML MIME 类型)会自动绕过过滤;
- 服务器未发送该头时,浏览器可能退回到不确定状态,尤其在混合内容或 iframe 场景下。
显式设置可覆盖用户设置与上下文限制,确保策略生效。
Tomcat 中的三种可靠配置方式
适用于 Tomcat 8.5+(含 9.x/10.x),所有方式均作用于 HTTP 响应头层面:
-
全局配置(推荐用于多应用环境):编辑
conf/server.xml,在<host></host>内添加 Valve:<valve classname="org.apache.catalina.valves.HeaderValve" header="X-XSS-Protection" value="1; mode=block"></valve> -
应用级配置(web.xml):在 Web 应用的
WEB-INF/web.xml中添加 filter:<filter><filter-name>XssProtectionFilter</filter-name><filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class><init-param><param-name>headers</param-name><param-value>X-XSS-Protection=1; mode=block</param-value></init-param></filter> -
代码中动态添加(适合 Spring Boot 等):在拦截器或过滤器中调用:
response.setHeader("X-XSS-Protection", "1; mode=block");
配置值取舍与避坑要点
不建议使用 0 或纯 1,也不推荐 report=:
-
X-XSS-Protection: 0彻底关闭防护,等同放弃旧浏览器最后一道防线; -
X-XSS-Protection: 1仅清理恶意片段,攻击者可能利用残留 DOM 或事件绑定绕过; -
mode=block是关键增强项,避免“修复后仍执行”的风险; -
report=在 Chrome 78+ 和 Firefox 70+ 中已被废弃,且无统一上报标准,生产环境无效。
配合 CSP 构成纵深防御
X-XSS-Protection 只对反射型 XSS 有基础拦截能力,无法防御存储型或 DOM 型 XSS。必须同步部署 Content-Security-Policy:
- 至少包含:
default-src 'self'; script-src 'self' 'unsafe-inline'→ 后者需逐步替换为 nonce 或 hash; - CSP 是现代防护核心,X-XSS-Protection 是面向旧浏览器的补充层,二者不互斥,应共存;
- 可通过浏览器开发者工具的 Security 标签页验证两个头部是否同时生效。











