Spring Security 如何预防CSRF跨域攻击?

什么是CSRF攻击?了解CSRF攻击的最佳方法是看一个具体示例 。

Spring Security 如何预防CSRF跨域攻击?

文章插图
 
例子假设您银行的网站提供了一种表格,该表格允许将资金从当前登录的用户转移到另一个银行帐户 。
例如,转账表单可能如下所示:
<form method="post"    action="/transfer"><input type="text"    name="amount"/><input type="text"    name="routingNumber"/><input type="text"    name="account"/><input type="submit"    value=https://www.isolves.com/it/wl/aq/2021-01-15/"Transfer"/>http 的响请求可能如下:
POST /transfer HTTP/1.1Host: bank.example.comCookie: JSESSIONID=randomidContent-Type: Application/x-www-form-urlencodedamount=100.00&routingNumber=1234&account=9876现在,假装您对银行的网站进行身份验证,然后无需注销即可访问一个邪恶的网站 。
恶意网站包含具有以下格式的html页面:
<form method="post"    action="https://bank.example.com/transfer"><input type="hidden"    name="amount"    value=https://www.isolves.com/it/wl/aq/2021-01-15/"100.00"/>您想赢钱,因此单击“提交”按钮 。
在此过程中,您无意中将 $100 转让给了恶意用户 。
发生这种情况的原因是,尽管恶意网站无法看到您的cookie,但与您的银行关联的cookie仍与请求一起发送 。
最糟糕的是,使用JAVAScript可以使整个过程自动化 。这意味着您甚至不需要单击该按钮 。
此外,在访问受XSS攻击的诚实站点时,也很容易发生这种情况 。
那么,我们如何保护用户免受此类攻击呢?
【Spring Security 如何预防CSRF跨域攻击?】web 安全系列-02-XSS 跨站脚本攻击
防范CSRF攻击发生CSRF攻击的原因是受害者网站的HTTP请求与攻击者网站的请求完全相同 。
这意味着无法拒绝来自邪恶网站的请求,也不允许来自银行网站的请求 。
为了防御CSRF攻击,我们需要确保恶意站点无法提供请求中的某些内容,以便我们区分这两个请求 。
Spring提供了两种机制来防御CSRF攻击:
  • 同步器令牌模式
  • 在会话Cookie上指定SameSite属性
安全方法必须是幂等的为了使针对CSRF的任何一种保护都起作用,应用程序必须确保“安全” HTTP方法是幂等的 。
这意味着使用HTTP方法GET,HEAD,OPTIONS和TRACE进行的请求不应更改应用程序的状态 。
idempotent 幂等性防止重复提交
同步器令牌模式抵御CSRF攻击的最主要,最全面的方法是使用同步器令牌模式 。
Spring Security 如何预防CSRF跨域攻击?

文章插图
 
解决方案该解决方案是为了确保每个HTTP请求除了我们的会话cookie之外,还必须在HTTP请求中提供一个安全的,随机生成的值,称为CSRF令牌 。
提交HTTP请求时,服务器必须查找预期的CSRF令牌,并将其与HTTP请求中的实际CSRF令牌进行比较 。如果值不匹配,则应拒绝HTTP请求 。
这项工作的关键是,实际的CSRF令牌应该位于浏览器不会自动包含的HTTP请求的一部分中 。
ps: 这里可以发现防止重复提交和思想非常类似,甚至是验证码也是类似的思路 。不过要确保这个信息不会被自动放到请求之中 。
例如,在HTTP参数或HTTP标头中要求实际的CSRF令牌将防止CSRF攻击 。在cookie中要求实际CSRF令牌不起作用,因为浏览器会自动将cookie包含在HTTP请求中 。
我们可以放宽期望,仅对每个更新应用程序状态的HTTP请求仅要求实际的CSRF令牌 。
为此,我们的应用程序必须确保安全的HTTP方法是幂等的 。因为我们希望允许使用外部站点的链接来链接到我们的网站,所以这提高了可用性 。
此外,我们不想在HTTP GET中包含随机令牌,因为这可能导致令牌泄漏 。
让我们看一下使用同步令牌模式时示例将如何变化 。
假设实际的CSRF令牌必须位于名为_csrf的HTTP参数中 。
我们应用程序的转帐表单如下:


推荐阅读