HTTP 安全响应头备忘单¶
简介¶
HTTP 头是提升网络安全性的重要手段,且易于实现。正确的 HTTP 响应头有助于防止跨站脚本、点击劫持、信息泄露等安全漏洞。
在本备忘单中,我们将回顾所有与安全相关的 HTTP 头、推荐配置,并引用复杂头的其他资源。
安全头¶
X-Frame-Options¶
X-Frame-Options
HTTP 响应头用于指示浏览器是否允许在 <frame>
、<iframe>
、<embed>
或 <object>
中渲染页面。网站可以使用它来避免点击劫持攻击,确保其内容不被嵌入到其他网站中。
对于支持的浏览器,内容安全策略 (CSP) 的 frame-ancestors 指令已淘汰 X-Frame-Options(来源)。
X-Frame-Options 头只有在包含它的 HTTP 响应具有交互内容(例如链接、按钮)时才有用。如果 HTTP 响应是重定向或返回 JSON 数据的 API,X-Frame-Options 则不提供任何安全性。
建议¶
如果可能,请使用内容安全策略 (CSP) 的 frame-ancestors 指令。
不允许页面在框架中显示。
X-Frame-Options: DENY
X-XSS-Protection¶
HTTP X-XSS-Protection
响应头是 Internet Explorer、Chrome 和 Safari 的一项功能,它在检测到反射型跨站脚本 (XSS) 攻击时阻止页面加载。
警告:尽管此头可以保护尚未支持 CSP 的旧版网络浏览器用户,但在某些情况下,此头可能在原本安全的网站中创建 XSS 漏洞(来源)。
建议¶
使用禁用内联 JavaScript 的内容安全策略 (CSP)。
请勿设置此头或明确将其关闭。
X-XSS-Protection: 0
详情请参阅 Mozilla X-XSS-Protection。
X-Content-Type-Options¶
X-Content-Type-Options
响应 HTTP 头由服务器用于指示浏览器应遵循在 Content-Type 头中声明的 MIME 类型,而不是猜测。
此头用于阻止浏览器的 MIME 类型嗅探,这可能将不可执行的 MIME 类型转换为可执行的 MIME 类型(MIME 混淆攻击)。
建议¶
在整个站点正确设置 Content-Type 头。
X-Content-Type-Options: nosniff
Referrer-Policy¶
Referrer-Policy
HTTP 头控制请求中应包含多少引用信息(通过 Referer 头发送)。
建议¶
引用策略自 2014 年以来已受到浏览器支持。如今,现代浏览器中的默认行为是不再向同一站点发送所有引用信息(源、路径和查询字符串),而只向其他站点发送源。然而,由于并非所有用户都可能使用最新浏览器,我们建议通过在所有响应中发送此头来强制执行此行为。
Referrer-Policy: strict-origin-when-cross-origin
- 注意: 有关此头配置的更多信息,请参阅 Mozilla Referrer-Policy。
Content-Type¶
Content-Type
表示头用于指示资源的原始媒体类型(在应用任何内容编码进行发送之前)。如果未正确设置,资源(例如图像)可能会被解释为 HTML,从而导致 XSS 漏洞。
尽管始终建议正确设置 Content-Type
头,但只有当内容旨在由客户端渲染且资源不受信任(由用户提供或修改)时,它才构成漏洞。
建议¶
Content-Type: text/html; charset=UTF-8
- 注意:
charset
属性对于防止 HTML 页面中的 XSS 是必需的 - 注意:
text/html
可以是任何可能的 MIME 类型
Set-Cookie¶
Set-Cookie
HTTP 响应头用于将 cookie 从服务器发送到用户代理,以便用户代理以后可以将其发送回服务器。要发送多个 cookie,应在同一响应中发送多个 Set-Cookie 头。
这本身不是一个安全头,但其安全属性至关重要。
建议¶
- 请阅读 会话管理备忘单 以获取 cookie 配置选项的详细说明。
Strict-Transport-Security (HSTS)¶
HTTP Strict-Transport-Security
响应头(通常缩写为 HSTS)允许网站告诉浏览器只能使用 HTTPS 访问它,而不是使用 HTTP。
建议¶
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
- 注意:在使用此头之前,请仔细阅读其工作原理。如果 HSTS 头配置错误或 SSL/TLS 证书存在问题,合法用户可能无法访问该网站。例如,如果 HSTS 头设置了很长的持续时间,并且 SSL/TLS 证书过期或被撤销,合法用户可能无法访问该网站,直到 HSTS 头的持续时间到期。
请查阅 HTTP Strict Transport Security 备忘单 以获取更多信息。
Expect-CT ❌¶
Expect-CT
头允许站点选择报告证书透明度 (CT) 要求。鉴于主流客户端现在要求 CT 认证,剩余的唯一价值是将此类事件报告到头中指定的 report-uri 值。此头现在更多地关乎检测/报告,而不是强制执行。
建议¶
不要使用它。Mozilla 建议避免使用它,如果可能,从现有代码中删除它。
Content-Security-Policy (CSP)¶
内容安全策略 (CSP) 是一项安全功能,用于指定允许在网站或网络应用程序中加载的内容的来源。它是一个附加的安全层,有助于检测和减轻某些类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击。这些攻击用于从数据窃取到网站篡改再到恶意软件分发等各种目的。
- 注意:此头适用于可以加载和解释脚本和代码的页面,但对于返回不进行渲染内容的 REST API 响应可能没有意义。
建议¶
内容安全策略配置和维护复杂。有关自定义选项的说明,请阅读 内容安全策略备忘单
Access-Control-Allow-Origin¶
如果您不使用此头,您的站点默认受同源策略 (SOP) 保护。此头的作用是在特定情况下放宽此控制。
Access-Control-Allow-Origin
是 CORS(跨域资源共享)头。此头指示其所关联的响应是否可以与来自给定来源的请求代码共享。换句话说,如果 siteA 从 siteB 请求资源,siteB 应在其 Access-Control-Allow-Origin
头中指示 siteA 允许获取该资源,否则,由于同源策略 (SOP),访问将被阻止。
建议¶
如果您使用它,请设置特定的 来源 而不是 *
。详情请查阅 Access-Control-Allow-Origin。
Access-Control-Allow-Origin: https://yoursite.com
- 注意:根据您的需求,使用 '*' 可能是必要的。例如,对于应从任何来源访问的公共 API,可能需要允许 '*'。
Cross-Origin-Opener-Policy (COOP)¶
HTTP Cross-Origin-Opener-Policy
(COOP) 响应头允许您确保顶级文档不与跨域文档共享浏览上下文组。
此头与下面解释的 Cross-Origin-Embedder-Policy (COEP) 和 Cross-Origin-Resource-Policy (CORP) 协同工作。
此机制可以防御像 Spectre 这样的攻击,这些攻击可以跨越同源策略 (SOP) 为同一浏览上下文组中的资源建立的安全边界。
由于这些头与浏览器密切相关,因此将其应用于 REST API 或非浏览器客户端可能没有意义。
建议¶
将浏览上下文完全隔离到同源文档。
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy (COEP)¶
HTTP Cross-Origin-Embedder-Policy
(COEP) 响应头阻止文档加载任何未明确授予文档权限的跨域资源(使用 CORP 或 CORS)。
- 注意:启用此功能将阻止未正确配置的跨域资源加载。
建议¶
文档只能从同源加载资源,或加载明确标记为可从其他源加载的资源。
Cross-Origin-Embedder-Policy: require-corp
- 注意:您可以通过添加
crossorigin
属性来绕过特定资源 <img src="https://thirdparty.com/img.png" crossorigin>
Cross-Origin-Resource-Policy (CORP)¶
Cross-Origin-Resource-Policy
(CORP) 头允许您控制有权包含资源的来源集合。它是抵御 Spectre 等攻击的强大防御,因为它允许浏览器在给定响应进入攻击者的进程之前将其阻止。
建议¶
将当前资源加载限制为仅限于站点和子域。
Cross-Origin-Resource-Policy: same-site
Permissions-Policy (原 Feature-Policy)¶
Permissions-Policy 允许您控制哪些来源可以使用哪些浏览器功能,包括在顶级页面和嵌入式框架中。对于由 Feature Policy 控制的每个功能,只有当其来源与允许的来源列表匹配时,该功能才会在当前文档或框架中启用。这意味着您可以配置您的网站,使其永远不允许激活摄像头或麦克风。这可以防止注入(例如 XSS)启用摄像头、麦克风或其他浏览器功能。
更多信息:Permissions-Policy
建议¶
设置它并禁用您的网站不需要的所有功能,或者只允许授权域使用它们
Permissions-Policy: geolocation=(), camera=(), microphone=()
- 注意:此示例正在禁用所有域的地理位置、摄像头和麦克风。
FLoC (群组联邦学习)¶
FLoC 是 Google 在 2021 年提出的一种向用户群组("群组")提供基于兴趣的广告的方法。电子前沿基金会、Mozilla 等机构认为 FLoC 在保护用户隐私方面做得不够。
建议¶
网站可以通过发送此 HTTP 头来声明它不希望被包含在用户用于群组计算的网站列表中。
Permissions-Policy: interest-cohort=()
服务器¶
Server
头描述了处理请求的源服务器使用的软件——即生成响应的服务器。
这本身不是一个安全头,但其使用方式与安全性相关。
建议¶
删除此头或设置非信息性值。
Server: webserver
- 注意:请记住,攻击者有其他方式对服务器技术进行指纹识别。
X-Powered-By¶
X-Powered-By
头描述了网络服务器使用的技术。此信息将服务器暴露给攻击者。利用此头中的信息,攻击者可以更容易地发现漏洞。
建议¶
删除所有 X-Powered-By
头。
- 注意:请记住,攻击者有其他方式对您的技术栈进行指纹识别。
X-AspNet-Version¶
提供有关 .NET 版本的信息。
建议¶
禁用发送此头。在 web.config
的 <system.web>
部分添加以下行以删除它。
<httpRuntime enableVersionHeader="false" />
- 注意:请记住,攻击者有其他方式对您的技术栈进行指纹识别。
X-AspNetMvc-Version¶
提供有关 .NET 版本的信息。
建议¶
禁用发送此头。要删除 X-AspNetMvc-Version
头,请在 Global.asax
文件中添加以下行。
MvcHandler.DisableMvcResponseHeader = true;
- 注意:请记住,攻击者有其他方式对您的技术栈进行指纹识别。
X-DNS-Prefetch-Control¶
X-DNS-Prefetch-Control
HTTP 响应头控制 DNS 预取,这是一种浏览器主动对用户可能选择跟随的链接以及文档引用的项(包括图像、CSS、JavaScript 等)的 URL 执行域名解析的功能。
建议¶
浏览器的默认行为是执行 DNS 缓存,这对于大多数网站来说是好的。如果您不控制网站上的链接,您可能希望将值设置为 off
以禁用 DNS 预取,从而避免信息泄露给这些域。
X-DNS-Prefetch-Control: off
- 注意:不要依赖此功能来处理任何生产敏感事项:它不是标准或完全支持的,并且实现可能因浏览器而异。
Public-Key-Pins (HPKP)¶
HTTP Public-Key-Pins
响应头用于将特定的加密公钥与某个网络服务器关联起来,以降低使用伪造证书进行 MITM 攻击的风险。
建议¶
此头已弃用,不应再使用。
在不同技术中添加 HTTP 头¶
PHP¶
以下示例代码在 PHP 中设置了 X-Frame-Options
头。
header("X-Frame-Options: DENY");
Apache¶
以下是一个 .htaccess
示例配置,用于在 Apache 中设置 X-Frame-Options
头。请注意,如果没有 always
选项,该头将仅针对某些状态码发送,如 Apache 文档 中所述。
<IfModule mod_headers.c>
Header always set X-Frame-Options "DENY"
</IfModule>
IIS¶
在 IIS 的 Web.config
中添加以下配置以发送 X-Frame-Options
头。
<system.webServer>
...
<httpProtocol>
<customHeaders>
<add name="X-Frame-Options" value="DENY" />
</customHeaders>
</httpProtocol>
...
</system.webServer>
HAProxy¶
在您的前端、监听或后端配置中添加以下行以发送 X-Frame-Options
头。
http-response set-header X-Frame-Options DENY
Nginx¶
以下是一个示例配置,它在 Nginx 中设置了 X-Frame-Options
头。请注意,如果没有 always
选项,该头将仅针对某些状态码发送,如 Nginx 文档 中所述。
add_header "X-Frame-Options" "DENY" always;
Express¶
您可以使用 helmet 在 Express 中设置 HTTP 头。以下代码是添加 X-Frame-Options
头的示例。
const helmet = require('helmet');
const app = express();
// Sets "X-Frame-Options: SAMEORIGIN"
app.use(
helmet.frameguard({
action: "sameorigin",
})
);
测试安全头的正确实现¶
Mozilla Observatory¶
Mozilla Observatory 是一个在线工具,可帮助您检查网站的头状态。
SmartScanner¶
SmartScanner 有一个专门的 测试配置文件 用于测试 HTTP 头的安全性。在线工具通常测试给定地址的主页。但 SmartScanner 扫描整个网站。因此,您可以确保所有网页都设置了正确的 HTTP 头。
参考资料¶
- Mozilla: X-Frame-Options
- Mozilla: X-XSS-Protection
- hstspreload.org
- Mozilla: Strict-Transport-Security
- Mozilla: Content-Type
- Mozilla: Expect-CT
- Mozilla: Set-Cookie
- content-security-policy.com
- Mozilla: Cross-Origin-Opener-Policy
- resourcepolicy.fyi
- Mozilla: Cross-Origin-Resource-Policy
- Mozilla: Cross-Origin-Embedder-Policy
- Mozilla: Server Header
- 相关 OWASP 项目:Secure Headers Project