有人可能会建议为来自 Web 服务器的所有响应设置此标头(我正在考虑 value="1; mode=block")。
但是,在提供图像时设置它是否有意义?CSS 文件?来自 AJAX 调用的 JSON 响应?
XSS Auditor 在处理这些响应时是否关心此标头的存在?
有人可能会建议为来自 Web 服务器的所有响应设置此标头(我正在考虑 value="1; mode=block")。
但是,在提供图像时设置它是否有意义?CSS 文件?来自 AJAX 调用的 JSON 响应?
XSS Auditor 在处理这些响应时是否关心此标头的存在?
如果您决定使用X-XSS-Protection
,您应该为任何能够运行活动脚本内容的页面设置它。像 CSS 或图像这样的不可执行格式不受标题的影响。
请注意,尽管 SVG 图像能够运行脚本代码,但显然不尊重 Chrome 中的标头,这表明它仅适用于 HTML 文档。概念证明:
<?php
header('X-XSS-Protection: 1; mode=block');
header('Content-type: image/svg+xml');
?>
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg">
<?php echo $_GET['foo']; ?>
</svg>
像这样在浏览器中运行它:http://localhost/xss.php?foo=<script>alert(1)</script>
在我的测试中,尽管 XSS 过滤器处于活动状态,但仍会执行来自参数的反射 JS。但是如果将 content-type 更改为text/html
,则 JS 将被正确过滤。
(另请注意,X-XSS-Protection
标头的使用是有争议的,并且可能导致新的漏洞,这就是 Facebook 甚至决定完全停用 XSS 审核员的原因。请注意,设置标头并不能取代正确的输出转义。)
此标头对于任何能够执行 Javascript 的页面都是有意义的。这包括 HTML 文件,可能还有 SVG 和 XML,但不包括 Javascript 文件或 JSON 响应,因为浏览器不会通过访问它们来执行这些文件。