X-XSS-Protection

非标准:此功能是非标准的,并且不在标准轨道上。请勿在面向 Web 的生产网站上使用它:它不会对每个用户都起作用。实现之间也可能存在很大的不兼容性,并且行为在未来可能会发生变化。

HTTP X-XSS-Protection 响应头是 Internet Explorer、Chrome 和 Safari 的一项功能,当它们检测到反射型跨站脚本 ( XSS ) 攻击时,会阻止页面加载。当网站实施强大的 Content-Security-Policy 来禁用内联 JavaScript ('unsafe-inline') 时,在现代浏览器中,这些保护在很大程度上是不必要的。

警告:即使此功能可以保护尚未支持 CSP 的旧版 Web 浏览器的用户,但在某些情况下,XSS 保护可能会在原本安全的网站中创建 XSS 漏洞。有关更多信息,请参阅下面的部分。

注意

这意味着,如果您不需要支持旧版浏览器,建议您使用 Content-Security-Policy 且不允许多unsafe-inline 脚本。

头类型 响应头
禁止的头名称

语法

http
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 代码片段

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 标头设置为 01; mode=block 可以防止上述漏洞。前者将使浏览器运行所有脚本,而后者将完全阻止页面被处理(尽管如果网站可以嵌入到 <iframe> 中,这种方法可能容易受到 侧信道攻击 的影响)。

示例

阻止检测到反射型 XSS 攻击时页面加载。

http
X-XSS-Protection: 1; mode=block

PHP

php
header("X-XSS-Protection: 1; mode=block");

Apache (.htaccess)

apacheconf
<IfModule mod_headers.c>
  Header set X-XSS-Protection "1; mode=block"
</IfModule>

Nginx

nginx
add_header "X-XSS-Protection" "1; mode=block";

规范

不属于任何规范或草案的一部分。

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅