安全 HTTP 响应头
默认安全标头
Spring Security 提供了一组默认的安全相关的 HTTP 响应头,以提供安全的默认值。
Spring Security 的默认设置是包含以下标头
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: 0
仅在 HTTPS 请求中添加 Strict-Transport-Security |
如果默认值不满足您的需求,您可以轻松地从这些默认值中删除、修改或添加标头。有关每个标头的更多详细信息,请参阅相应的章节
缓存控制
Spring Security 的默认设置是禁用缓存以保护用户的内容。
如果用户进行身份验证以查看敏感信息,然后注销,我们不希望恶意用户能够点击后退按钮来查看敏感信息。默认情况下发送的缓存控制标头为
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
为了默认安全,Spring Security 默认添加了这些标头。但是,如果您的应用提供自己的缓存控制标头,Spring Security 会避开。这允许应用确保可以缓存静态资源(例如 CSS 和 JavaScript)。
内容类型选项
历史上,包括 Internet Explorer 在内的浏览器会尝试通过使用 内容嗅探 来猜测请求的内容类型。这允许浏览器通过猜测未指定内容类型的资源的内容类型来改善用户体验。例如,如果浏览器遇到一个未指定内容类型的 JavaScript 文件,它将能够猜测内容类型,然后运行它。
在允许上传内容时,还有许多其他事情需要做(例如,仅在特定域中显示文档、确保设置 Content-Type 标头、清理文档等)。但是,这些措施超出了 Spring Security 提供的范围。同样重要的是要注意,在禁用内容嗅探时,必须指定内容类型才能使事情正常工作。 |
内容嗅探的问题在于,这允许恶意用户使用多义文件(即,作为多种内容类型有效的文件)来执行 XSS 攻击。例如,某些站点可能允许用户向网站提交有效的 PostScript 文档并查看它。恶意用户可能会创建一个既是有效 PostScript 文件又是有效 JavaScript 文件的文件,并用它执行 XSS 攻击。
默认情况下,Spring Security 通过将以下标头添加到 HTTP 响应中来禁用内容嗅探
X-Content-Type-Options: nosniff
HTTP 严格传输安全 (HSTS)
当您输入银行网站时,您是输入mybank.example.com
还是输入https://mybank.example.com
?如果您省略了https
协议,则可能容易受到中间人攻击的影响。即使网站执行重定向到https://mybank.example.com
,恶意用户也可以拦截初始 HTTP 请求并操纵响应(例如,重定向到https://mibank.example.com
并窃取其凭据)。
许多用户省略了https
协议,这就是创建HTTP 严格传输安全 (HSTS)的原因。一旦mybank.example.com
被添加为HSTS 主机,浏览器就可以提前知道对 mybank.example.com 的任何请求都应解释为https://mybank.example.com
。这大大降低了中间人攻击发生的可能性。
根据RFC6797,HSTS 标头仅注入到 HTTPS 响应中。为了让浏览器确认标头,浏览器必须首先信任用于建立连接的 SSL 证书的 CA(不仅仅是 SSL 证书)。 |
网站被标记为 HSTS 主机的一种方法是将主机预加载到浏览器中。另一种方法是将Strict-Transport-Security
标头添加到响应中。例如,Spring Security 的默认行为是添加以下标头,该标头指示浏览器将域视为一年的 HSTS 主机(非闰年有 31536000 秒)
Strict-Transport-Security: max-age=31536000 ; includeSubDomains ; preload
可选的includeSubDomains
指令指示浏览器子域(例如secure.mybank.example.com
)也应被视为 HSTS 域。
可选的preload
指令指示浏览器将域预加载到浏览器中作为 HSTS 域。有关 HSTS 预加载的更多详细信息,请参阅hstspreload.org。
HTTP 公钥固定 (HPKP)
为了保持被动,Spring Security 仍然提供对 servlet 环境中 HPKP 的支持。但是,由于前面列出的原因,Spring Security 团队不再推荐使用 HPKP。 |
HTTP 公钥固定 (HPKP)向 Web 客户端指定要与特定 Web 服务器一起使用的公钥,以防止使用伪造证书的中间人 (MITM) 攻击。如果正确使用,HPKP 可以添加额外的保护层以防止证书被泄露。但是,由于 HPKP 的复杂性,许多专家不再建议使用它,并且Chrome 甚至已删除对它的支持。
有关不再推荐使用 HPKP 的更多详细信息,请阅读HTTP 公钥固定已死吗?和我放弃 HPKP 了。
X-Frame-Options
允许将您的网站添加到框架中可能是一个安全问题。例如,通过使用巧妙的 CSS 样式,用户可能会被诱骗点击他们本不打算点击的内容。例如,登录其银行的用户可能会点击一个授予其他用户访问权限的按钮。这种类型的攻击被称为点击劫持。
处理点击劫持的另一种现代方法是使用内容安全策略 (CSP)。 |
有许多方法可以减轻点击劫持攻击。例如,为了保护旧版浏览器免受点击劫持攻击,您可以使用框架中断代码。虽然不完美,但框架中断代码是您可以为旧版浏览器做的最好的事情。
解决点击劫持的一种更现代的方法是使用X-Frame-Options标头。默认情况下,Spring Security 使用以下标头禁用在 iframe 中呈现页面
X-Frame-Options: DENY
X-XSS-Protection
一些浏览器内置了过滤反射型 XSS 攻击的支持。该过滤器已在主要浏览器中弃用,并且当前 OWASP 建议是将标头显式设置为 0。
默认情况下,Spring Security 使用以下标头阻止内容
X-XSS-Protection: 0
内容安全策略 (CSP)
内容安全策略 (CSP)是一种机制,Web 应用程序可以使用它来减轻内容注入漏洞,例如跨站点脚本 (XSS)。CSP 是一种声明性策略,它为 Web 应用程序作者提供了一种工具来声明并最终告知客户端(用户代理)Web 应用程序期望从中加载资源的来源。
内容安全策略并非旨在解决所有内容注入漏洞。相反,您可以使用 CSP 来帮助减少内容注入攻击造成的损害。作为第一道防线,Web 应用程序作者应验证其输入并对其输出进行编码。 |
Web 应用程序可以通过在响应中包含以下 HTTP 标头之一来使用 CSP
-
Content-Security-Policy
-
Content-Security-Policy-Report-Only
每个标头都用作将安全策略传递给客户端的机制。安全策略包含一组安全策略指令,每个指令负责声明特定资源表示的限制。
例如,Web 应用程序可以通过在响应中包含以下标头来声明它期望从特定、受信任的来源加载脚本
Content-Security-Policy: script-src https://trustedscripts.example.com
尝试从除script-src
指令中声明的内容之外的其他来源加载脚本将被用户代理阻止。此外,如果在安全策略中声明了report-uri指令,则用户代理会将违规情况报告到声明的 URL。
例如,如果 Web 应用程序违反了声明的安全策略,则以下响应标头指示用户代理将违规报告发送到策略的report-uri
指令中指定的 URL。
Content-Security-Policy: script-src https://trustedscripts.example.com; report-uri /csp-report-endpoint/
违规报告是标准的 JSON 结构,Web 应用程序自己的 API 或公开托管的 CSP 违规报告服务(例如report-uri.io/)都可以捕获这些结构。
Content-Security-Policy-Report-Only
标头使 Web 应用程序作者和管理员能够监视安全策略而不是强制执行它们。此标头通常用于在试验或开发站点的安全策略时使用。当策略被认为有效时,可以通过使用Content-Security-Policy
标头字段来强制执行它。
给定以下响应标头,策略声明脚本可以从两个可能的来源之一加载。
Content-Security-Policy-Report-Only: script-src 'self' https://trustedscripts.example.com; report-uri /csp-report-endpoint/
如果站点违反了此策略,则尝试从evil.example.com
加载脚本,用户代理会将违规报告发送到report-uri
指令中指定的声明的 URL,但仍允许加载违规资源。
将内容安全策略应用于 Web 应用程序通常是一项非平凡的任务。以下资源可能在为您的站点开发有效的安全策略方面提供进一步的帮助
自定义标头
请参阅相关部分,了解如何配置基于Servlet的应用程序。 |
Spring Security提供了一些机制,可以方便地将更常见的安全标头添加到您的应用程序中。但是,它也提供了挂钩来启用添加自定义标头。