跳到内容

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

Content-Type

Content-Type 表示头用于指示资源的原始媒体类型(在应用任何内容编码进行发送之前)。如果未正确设置,资源(例如图像)可能会被解释为 HTML,从而导致 XSS 漏洞。

尽管始终建议正确设置 Content-Type 头,但只有当内容旨在由客户端渲染且资源不受信任(由用户提供或修改)时,它才构成漏洞。

建议

Content-Type: text/html; charset=UTF-8

  • 注意: charset 属性对于防止 HTML 页面中的 XSS 是必需的
  • 注意text/html 可以是任何可能的 MIME 类型

Set-Cookie HTTP 响应头用于将 cookie 从服务器发送到用户代理,以便用户代理以后可以将其发送回服务器。要发送多个 cookie,应在同一响应中发送多个 Set-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 头。

参考资料