X-XSS-Protection
非标准:此功能是非标准的,并且不在标准轨道上。请勿在面向 Web 的生产网站上使用它:它不会对每个用户都起作用。实现之间也可能存在很大的不兼容性,并且行为在未来可能会发生变化。
HTTP X-XSS-Protection
响应头是 Internet Explorer、Chrome 和 Safari 的一项功能,当它们检测到反射型跨站脚本 ( XSS ) 攻击时,会阻止页面加载。当网站实施强大的 Content-Security-Policy
来禁用内联 JavaScript ('unsafe-inline'
) 时,在现代浏览器中,这些保护在很大程度上是不必要的。
警告:即使此功能可以保护尚未支持 CSP 的旧版 Web 浏览器的用户,但在某些情况下,XSS 保护可能会在原本安全的网站中创建 XSS 漏洞。有关更多信息,请参阅下面的部分。
注意
- Chrome 已 删除其 XSS 审核器
- Firefox 尚未删除,并且 不会实施
X-XSS-Protection
- Edge 已 停用其 XSS 过滤器
这意味着,如果您不需要支持旧版浏览器,建议您使用 Content-Security-Policy
且不允许多unsafe-inline
脚本。
语法
X-XSS-Protection: 0
X-XSS-Protection: 1
X-XSS-Protection: 1; mode=block
X-XSS-Protection: 1; report=<reporting-uri>
- 0
-
禁用 XSS 过滤。
- 1
-
启用 XSS 过滤(通常是浏览器的默认设置)。如果检测到跨站脚本攻击,浏览器将清理页面(删除不安全的部件)。
- 1; mode=block
-
启用 XSS 过滤。浏览器不会清理页面,而是如果检测到攻击则会阻止渲染页面。
- 1; report=<reporting-URI> (仅限 Chromium)
-
启用 XSS 过滤。如果检测到跨站脚本攻击,浏览器将清理页面并报告违规行为。这使用 CSP
report-uri
指令的功能来发送报告。
由 XSS 过滤引起的漏洞
考虑以下网页 HTML 代码片段
<script>
var productionMode = true;
</script>
<!-- [...] -->
<script>
if (!window.productionMode) {
// Some vulnerable debug code
}
</script>
如果浏览器不执行 XSS 过滤,则此代码是完全安全的。但是,如果浏览器执行 XSS 过滤并且搜索查询为 ?something=%3Cscript%3Evar%20productionMode%20%3D%20true%3B%3C%2Fscript%3E
,则浏览器可能会执行页面中的脚本,忽略 <script>var productionMode = true;</script>
(认为服务器将其包含在响应中,因为它位于 URI 中),导致 window.productionMode
被评估为 undefined
并执行不安全的调试代码。
将 X-XSS-Protection
标头设置为 0
或 1; mode=block
可以防止上述漏洞。前者将使浏览器运行所有脚本,而后者将完全阻止页面被处理(尽管如果网站可以嵌入到 <iframe>
中,这种方法可能容易受到 侧信道攻击 的影响)。
示例
阻止检测到反射型 XSS 攻击时页面加载。
X-XSS-Protection: 1; mode=block
PHP
header("X-XSS-Protection: 1; mode=block");
Apache (.htaccess)
<IfModule mod_headers.c>
Header set X-XSS-Protection "1; mode=block"
</IfModule>
Nginx
add_header "X-XSS-Protection" "1; mode=block";
规范
不属于任何规范或草案的一部分。
浏览器兼容性
BCD 表格仅在浏览器中加载