对于最新的稳定版本,请使用 Spring Security 6.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Security 6.3.1Spring中文文档

文档的这一部分讨论安全 HTTP 响应标头的一般主题。 有关安全、HTTP 响应标头、servlet基于 WebFlux 的应用程序的具体信息,请参阅相关部分。Spring中文文档

有许多 HTTP 响应标头可用于提高 Web 应用程序的安全性。 本节专门介绍Spring Security提供显式支持的各种HTTP响应标头。 如有必要,还可以将 Spring Security 配置为提供自定义标头Spring中文文档

文档的这一部分讨论安全 HTTP 响应标头的一般主题。 有关安全、HTTP 响应标头、servlet基于 WebFlux 的应用程序的具体信息,请参阅相关部分。Spring中文文档

默认安全标头

请参阅相关部分,了解如何为基于 servletwebflux 的应用程序自定义缺省值。Spring中文文档

Spring Security 提供了一组默认的与安全相关的 HTTP 响应标头,以提供安全的默认值。Spring中文文档

Spring Security 的默认设置是包含以下标头:Spring中文文档

默认安全 HTTP 响应标头
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Strict-Transport-Security 仅在 HTTPS 请求上添加

如果默认值不能满足您的需求,您可以轻松地从这些默认值中删除、修改或添加标头。 有关每个标头的其他详细信息,请参阅相应的部分:Spring中文文档

请参阅相关部分,了解如何为基于 servletwebflux 的应用程序自定义缺省值。Spring中文文档

Strict-Transport-Security 仅在 HTTPS 请求上添加

缓存控制

请参阅相关部分,了解如何为基于 servletwebflux 的应用程序自定义缺省值。Spring中文文档

Spring Security 的默认设置是禁用缓存以保护用户的内容。Spring中文文档

如果用户通过身份验证查看敏感信息,然后注销,我们不希望恶意用户能够单击后退按钮查看敏感信息。 默认情况下发送的缓存控件标头为:Spring中文文档

默认缓存控制 HTTP 响应标头
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0

为了在默认情况下安全起见,Spring Security 默认添加这些标头。 但是,如果您的应用程序提供自己的缓存控制标头,Spring Security 将退出。 这允许应用程序确保可以缓存 CSS 和 JavaScript 等静态资源。Spring中文文档

请参阅相关部分,了解如何为基于 servletwebflux 的应用程序自定义缺省值。Spring中文文档

内容类型选项

请参阅相关部分,了解如何为基于 servletwebflux 的应用程序自定义缺省值。Spring中文文档

从历史上看,包括 Internet Explorer 在内的浏览器会尝试使用内容嗅探来猜测请求的内容类型。 这允许浏览器通过猜测未指定内容类型的资源上的内容类型来改善用户体验。 例如,如果浏览器遇到未指定内容类型的 JavaScript 文件,它将能够猜测内容类型,然后运行它。Spring中文文档

在允许上传内容时,还应该做许多其他事情(即仅在不同的域中显示文档,确保设置了 Content-Type 标题,清理文档等)。 但是,这些措施超出了Spring Security提供的范围。 同样重要的是要指出,在禁用内容嗅探时,必须指定内容类型才能正常工作。Spring中文文档

内容嗅探的问题在于,这允许恶意用户使用多语言(即作为多种内容类型有效的文件)来执行 XSS 攻击。 例如,某些网站可能允许用户将有效的 postscript 文档提交到网站并查看它。 恶意用户可能会创建一个 postscript 文档,该文档也是有效的 JavaScript 文件,并使用它执行 XSS 攻击。Spring中文文档

默认情况下,Spring Security 通过向 HTTP 响应添加以下标头来禁用内容嗅探:Spring中文文档

nosniff HTTP 响应头
X-Content-Type-Options: nosniff

请参阅相关部分,了解如何为基于 servletwebflux 的应用程序自定义缺省值。Spring中文文档

在允许上传内容时,还应该做许多其他事情(即仅在不同的域中显示文档,确保设置了 Content-Type 标题,清理文档等)。 但是,这些措施超出了Spring Security提供的范围。 同样重要的是要指出,在禁用内容嗅探时,必须指定内容类型才能正常工作。Spring中文文档

HTTP 严格传输安全 (HSTS)

请参阅相关部分,了解如何为基于 servletwebflux 的应用程序自定义缺省值。Spring中文文档

当您输入银行网站时,您是输入 mybank.example.com 还是输入 mybank.example.com? 如果省略 https 协议,则可能容易受到中间人攻击。 即使网站执行重定向 mybank.example.com 恶意用户也可以拦截初始 HTTP 请求并操纵响应(例如重定向到 mibank.example.com 并窃取其凭据)。Spring中文文档

许多用户省略了 https 协议,这就是创建 HTTP 严格传输安全 (HSTS) 的原因。 将 mybank.example.com 添加为 HSTS 主机后,浏览器可以提前知道任何对 mybank.example.com 的请求都应解释为 mybank.example.com。 这大大降低了中间人攻击发生的可能性。Spring中文文档

根据RFC6797,HSTS 标头仅注入到 HTTPS 响应中。 为了使浏览器确认标头,浏览器必须首先信任签署用于建立连接的 SSL 证书的 CA(而不仅仅是 SSL 证书)。Spring中文文档

将站点标记为 HSTS 主机的一种方法是将主机预加载到浏览器中。 另一种方法是将标头添加到响应中。 例如,Spring Security 的默认行为是添加以下标头,指示浏览器将域视为 HSTS 主机一年(一年中大约有 31536000 秒):Strict-Transport-SecuritySpring中文文档

严格的传输安全性 HTTP 响应标头
Strict-Transport-Security: max-age=31536000 ; includeSubDomains ; preload

可选指令指示浏览器子域(例如 secure.mybank.example.com)也应被视为 HSTS 域。includeSubDomainsSpring中文文档

可选指令指示浏览器应将域作为 HSTS 域预加载到浏览器中。 有关HSTS预加载的更多详细信息,请参阅 hstspreload.orgpreloadSpring中文文档

请参阅相关部分,了解如何为基于 servletwebflux 的应用程序自定义缺省值。Spring中文文档

根据RFC6797,HSTS 标头仅注入到 HTTPS 响应中。 为了使浏览器确认标头,浏览器必须首先信任签署用于建立连接的 SSL 证书的 CA(而不仅仅是 SSL 证书)。Spring中文文档

HTTP 公钥固定 (HPKP)

为了保持被动,Spring Security 仍然在 servlet 环境中提供对 HPKP 的支持,但由于上述原因,安全团队不再推荐 HPKP。Spring中文文档

HTTP 公钥固定 (HPKP) 向 Web 客户端指定要与某些 Web 服务器一起使用的公钥,以防止中间人 (MITM) 使用伪造证书进行攻击。 如果使用得当,HPKP 可以添加额外的保护层,防止证书泄露。 然而,由于 HPKP 的复杂性,许多专家不再推荐使用它,Chrome 甚至取消了对它的支持。Spring中文文档

有关不再推荐 HPKP 的原因的更多详细信息,请阅读 HTTP 公钥固定是否已死?,我将放弃 HPKPSpring中文文档

为了保持被动,Spring Security 仍然在 servlet 环境中提供对 HPKP 的支持,但由于上述原因,安全团队不再推荐 HPKP。Spring中文文档

X-Frame-选项

请参阅相关部分,了解如何为基于 servletwebflux 的应用程序自定义缺省值。Spring中文文档

允许您的网站添加到框架中可能是一个安全问题。 例如,使用巧妙的CSS样式,用户可能会被诱骗点击他们不想要的东西。 例如,登录到其银行的用户可能会单击向其他用户授予访问权限的按钮。 这种攻击被称为点击劫持Spring中文文档

处理点击劫持的另一种现代方法是使用内容安全策略 (CSP)。Spring中文文档

有多种方法可以缓解点击劫持攻击。 例如,为了保护旧版浏览器免受点击劫持攻击,您可以使用帧中断代码。 虽然不完美,但帧中断代码是您可以为旧版浏览器做的最好的。Spring中文文档

解决点击劫持问题的更现代方法是使用 X-Frame-Options 标头。 默认情况下,Spring Security 使用以下标头禁用在 iframe 中呈现页面:Spring中文文档

X-Frame-Options: DENY

请参阅相关部分,了解如何为基于 servletwebflux 的应用程序自定义缺省值。Spring中文文档

处理点击劫持的另一种现代方法是使用内容安全策略 (CSP)。Spring中文文档

X-XSS保护

请参阅相关部分,了解如何为基于 servletwebflux 的应用程序自定义缺省值。Spring中文文档

某些浏览器内置了对过滤掉反射的 XSS 攻击的支持。 这绝不是万无一失的,但确实有助于 XSS 保护。Spring中文文档

默认情况下,筛选通常处于启用状态,因此添加标头通常只能确保它处于启用状态,并指示浏览器在检测到 XSS 攻击时执行的操作。 例如,过滤器可能会尝试以侵入性最小的方式更改内容,以仍呈现所有内容。 有时,这种类型的替换本身可能成为 XSS 漏洞。 相反,最好阻止内容,而不是尝试修复它。 默认情况下,Spring Security 使用以下标头阻止内容:Spring中文文档

X-XSS-Protection: 1; mode=block

请参阅相关部分,了解如何为基于 servletwebflux 的应用程序自定义缺省值。Spring中文文档

内容安全策略 (CSP)

请参阅相关部分,了解如何配置基于 servletwebflux 的应用程序。Spring中文文档

内容安全策略 (CSP) 是 Web 应用程序可以用来缓解内容注入漏洞(如跨站点脚本 (XSS))的一种机制。 CSP 是一种声明性策略,它为 Web 应用程序作者提供了一种工具,用于声明并最终通知客户端(用户代理)有关 Web 应用程序预期从中加载资源的源。Spring中文文档

内容安全策略并非旨在解决所有内容注入漏洞。 相反,可以利用 CSP 来帮助减少内容注入攻击造成的危害。 作为第一道防线,Web 应用程序作者应验证其输入并对其输出进行编码。Spring中文文档

Web 应用程序可以通过在响应中包含以下 HTTP 标头之一来使用 CSP:Spring中文文档

这些标头中的每一个都用作向客户端传递安全策略的机制。 安全策略包含一组安全策略指令,每个指令负责声明特定资源表示形式的限制。Spring中文文档

例如,Web 应用程序可以通过在响应中包含以下标头来声明它期望从特定的受信任源加载脚本:Spring中文文档

内容安全策略示例
Content-Security-Policy: script-src https://trustedscripts.example.com

用户代理将阻止尝试从指令中声明的其他源加载脚本。 此外,如果在安全策略中声明了 report-uri 指令,则用户代理将向声明的 URL 报告违规。script-srcSpring中文文档

例如,如果 Web 应用程序违反了声明的安全策略,则以下响应标头将指示用户代理将违规报告发送到策略指令中指定的 URL。report-uriSpring中文文档

带有 report-uri 的内容安全策略
Content-Security-Policy: script-src https://trustedscripts.example.com; report-uri /csp-report-endpoint/

违规报告是标准的 JSON 结构,可由 Web 应用程序自己的 API 或公共托管的 CSP 违规报告服务(例如 report-uri.com/)捕获。Spring中文文档

标头为 Web 应用程序作者和管理员提供了监视安全策略的功能,而不是强制执行这些策略。 此标头通常用于试验和/或开发站点的安全策略。 当策略被视为有效时,可以改用标头字段来强制执行该策略。Content-Security-Policy-Report-OnlyContent-Security-PolicySpring中文文档

给定以下响应标头,该策略声明可以从两个可能的来源之一加载脚本。Spring中文文档

仅限内容安全策略报告
Content-Security-Policy-Report-Only: script-src 'self' https://trustedscripts.example.com; report-uri /csp-report-endpoint/

如果站点违反此策略,则通过尝试从 evil.com 加载脚本,用户代理将向 report-uri 指令指定的声明的 URL 发送违规报告,但仍允许加载违规资源。Spring中文文档

将内容安全策略应用于 Web 应用程序通常是一项艰巨的任务。 以下资源可能会为您的站点制定有效的安全策略提供进一步的帮助。Spring中文文档

请参阅相关部分,了解如何配置基于 servletwebflux 的应用程序。Spring中文文档

内容安全策略并非旨在解决所有内容注入漏洞。 相反,可以利用 CSP 来帮助减少内容注入攻击造成的危害。 作为第一道防线,Web 应用程序作者应验证其输入并对其输出进行编码。Spring中文文档

推荐人政策

请参阅相关部分,了解如何配置基于 servletwebflux 的应用程序。Spring中文文档

反向链接策略是一种机制,Web 应用程序可以利用该机制来管理反向链接字段,其中包含最后一个 用户所在的页面。Spring中文文档

Spring Security 的方法是使用 Referrer Policy 标头,它提供不同的策略Spring中文文档

推荐人策略示例
Referrer-Policy: same-origin

Referrer-Policy 响应标头指示浏览器让目标知道用户以前所在的源。Spring中文文档

请参阅相关部分,了解如何配置基于 servletwebflux 的应用程序。Spring中文文档

功能策略

请参阅相关部分,了解如何配置基于 servletwebflux 的应用程序。Spring中文文档

功能策略是一种机制,允许 Web 开发人员有选择地启用、禁用和修改浏览器中某些 API 和 Web 功能的行为。Spring中文文档

功能策略示例
Feature-Policy: geolocation 'self'

借助功能策略,开发人员可以选择加入一组“策略”,以便浏览器对整个网站中使用的特定功能强制执行。 这些策略限制网站可以访问的 API 或修改浏览器对某些功能的默认行为。Spring中文文档

请参阅相关部分,了解如何配置基于 servletwebflux 的应用程序。Spring中文文档

权限策略

请参阅相关部分,了解如何配置基于 servletwebflux 的应用程序。Spring中文文档

权限策略是一种机制,允许 Web 开发人员有选择地启用、禁用和修改浏览器中某些 API 和 Web 功能的行为。Spring中文文档

权限策略示例
Permissions-Policy: geolocation=(self)

借助权限策略,开发人员可以选择加入一组“策略”,以便浏览器对整个站点中使用的特定功能强制执行。 这些策略限制网站可以访问的 API 或修改浏览器对某些功能的默认行为。Spring中文文档

请参阅相关部分,了解如何配置基于 servletwebflux 的应用程序。Spring中文文档

清除网站数据

请参阅相关部分,了解如何配置基于 servletwebflux 的应用程序。Spring中文文档

清除站点数据是一种机制,当 HTTP 响应包含以下标头时,可以删除任何浏览器端数据(Cookie、本地存储等):Spring中文文档

Clear-Site-Data: "cache", "cookies", "storage", "executionContexts"

这是在注销时执行的一个很好的清理操作。Spring中文文档

请参阅相关部分,了解如何配置基于 servletwebflux 的应用程序。Spring中文文档

跨域策略

请参阅相关部分,了解如何为基于 servletwebflux 的应用程序进行配置。Spring中文文档

Spring Security 提供对一些重要的跨域策略标头的支持。 这些标头是:Spring中文文档

Cross-Origin-Opener-Policy(COOP) 允许顶级文档断开其窗口与浏览上下文组中的任何其他窗口(例如,弹出窗口与其打开器之间的关联),从而阻止它们之间的任何直接 DOM 访问。Spring中文文档

启用 (COEP) 可防止文档加载任何未显式授予文档加载权限的非同源资源。Cross-Origin-Embedder-PolicySpring中文文档

(CORP) 标头允许您控制授权包含资源的源集。它是针对 Spectre 等攻击的强大防御措施,因为它允许浏览器在给定响应进入攻击者的进程之前阻止它。Cross-Origin-Resource-PolicySpring中文文档

请参阅相关部分,了解如何为基于 servletwebflux 的应用程序进行配置。Spring中文文档

自定义标头

请参阅相关部分,了解如何配置基于 servlet 的应用程序。Spring中文文档

Spring Security 具有一些机制,可以方便地将更常见的安全标头添加到您的应用程序中。 但是,它还提供了钩子来启用添加自定义标头。Spring中文文档

请参阅相关部分,了解如何配置基于 servlet 的应用程序。Spring中文文档