本文将带你了解什么是跨站请求伪造(CSRF)攻击?以及如何使用 Spring Security 来防范这些攻击。
CSRF 攻击有多种形式。
假如下面这个 GET 请求,用于一个已登录的用户向指定的银行账户 转账:
如果攻击者想把钱从受害者的账户转到自己的账户(),他需要让受害者触发请求:
有多种方法可以实现这一点:
- 链接 - 攻击者可以说服/诱导受害者点击该链接,例如执行转账:
- 图片 - 攻击者可能会使用 标签,将目标 URL 作为图片来源。换句话说,甚至不需要点击。请求将在页面加载时自动执行:
所以,涉及到敏感的业务,千万不能用 GET 请求。
假设转账 API 是一个 POST 请求。
在这种情况下, 和 标签都不起作用。
攻击者需要使用 :
然后,使用 JavaScript 自动提交表单:
在 Spring 应用中模拟 CSRF 攻击。
创建一个 “银行” 应用,定义一个转账 API :
还需要一个基本的 HTML 页面来触发银行转账操作:
这是在银行应用上运行的客户端页面。
如上,通过一个简单的链接实现了 ,通过一个简单的 实现了 。
现在、来看看攻击者页面的样子:
该页面在不同的应用上运行,即攻击者的应用。
最后,在本地运行银行应用和攻击者应用。
要使攻击奏效,用户需要使用 Session cookie 对银行应用进行身份认证。
首先,访问银行应用页面:
它将在浏览器上设置 cookie。
然后访问攻击者应用:
追踪源自此页面的请求,能够发现那些针对银行应用的请求。由于 Cookie 会自动随这些请求一起提交,Spring 会将它们视为来自银行页面的请求进行身份认证。
为了保护 MVC 应用,Spring 会在每个生成的视图中添加一个 CSRF Token。该 Token 必须在每次修改状态的 HTTP 请求(PATCH、POST、PUT 和 DELETE)中提交给服务器。这可以保护应用免受 CSRF 攻击,因为攻击者无法从自己的页面获取此 Token。
在旧版 XML 配置(Spring Security 4 之前)中,CSRF 保护默认是禁用的,可以根据需要启用它:
从 Spring Security 4.x 开始,默认启用 CSRF 保护。
该默认配置将 Token 添加到名为 的 属性中。
如果需要,可以禁用此配置:
现在,需要在请求中包含 CSRF Token。
属性包含以下信息:
- - CSRF Token 值
- - HTML 表单参数的名称,其中必须包含 Token 值
- - HTTP Header 的名称,其中必须包含 Token 值
如果视图使用 HTML 表单,可以使用 和 值添加隐藏 input:
如果视图使用 JSON,则需要使用 和 值添加 HTTP 请求头信息。
首先在 标签中包含 Token 值和 Header 名称:
然后,用 JQuery 获取 标签值:
最后,使用这些值来设置 XHR Header:
无状态 API 是否需要 CSRF 保护?
如果无状态 API 使用基于 Token 的身份验证(如 JWT),就不需要 CSRF 保护。反之,如果使用 Session Cookie 进行身份验证,就需要启用 CSRF 保护
无状态 API 无法像 MVC 配置那样添加 Token,因为它不会生成任何 HTML 视图。
在这种情况下,可以使用 在 Cookie 中发送 CSRF Token:
此配置将为前端设置一个名为 的 Cookie。由于将 标志设置为 ,因此前端能使用 JavaScript 获取此 Cookie。
通过 JavaScript 从 列表中搜索 Cookie 值。
由于该列表以字符串形式存储,因此可以使用此 regex (正则)进行检索:
然后,必须向每个修改 API 状态的 请求发送 Token: POST、PUT、DELETE 和 PATCH。
Spring 会通过 Header 来接收它。
只需使用 JavaScript Fetch API 设置即可:
首先尝试在禁用 CSRF 时提交一个简单的 POST 请求:
如上,通过继承 类来获取常用的测试辅助方法。
注意,当用户拥有正确的凭证时,请求就会被成功执行,不需要额外的信息。
这意味着攻击者只需使用前面讨论过的任何攻击方式,就能入侵系统。
现在启用 CSRF 保护,看看有什么不同:
可以看到这次测试使用了不同的安全配置,即启用了 CSRF 保护。
现在,如果不包含 CSRF Token,POST 请求将直接失败,这当然意味着先前的攻击不再可行。
此外,测试中的 方法会创建一个 ,在请求中自动填充一个有效的 Token,以便进行测试。
本文介绍了 CSRF 攻击的几种方式,以及如何在 Spring 应用中使用 Spring Security 来避免 CSRF 攻击。
Ref:
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/2752.html