跨站请求伪造

下面分析下为什么要这么做:具体解释在http://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html

中给出了解释,我总结下。

这里是因为Spring Security在解决跨站请求伪造时的特有的机制

首先了解下,什么是跨站请求伪造

CSRF攻击

在讨论Spring Security如何保护应用免受CSRF攻击之前,我们先解释一下什么是CSRF攻击。为了更好的理解,我们下面看一个例子。


假设你银行的网站提供一个表单,这个表单允许把钱从当前登陆的用户转入另外一个银行账户,例如,HTTP请求可能会像下面一样

POST /transfer HTTP/1.1
Host: bank.example.com
Cookie: JSESSIONID=randomid; Domain=bank.example.com; Secure; HttpOnly
Content-Type: application/x-www-form-urlencoded

amount=100.00&routingNumber=1234&account=9876
现在,假设你得到了你的银行网站的授权,然后没有登出,并且访问一个恶意网站,这个恶意网站包含如下的HTML页面,页面中有如下的表单:
<formaction="https://bank.example.com/transfer"method="post"><inputtype="hidden"name="amount"value="100.00"/><inputtype="hidden"name="routingNumber"value="evilsRoutingNumber"/><inputtype="hidden"name="account"value="evilsAccountNumber"/><inputtype="submit"value="Win Money!"/></form>
比如你想赢钱,所以你点击了提交按钮,当你点击提交按钮时,在这个过程中,你将不经意的向一个恶意用户转账100元。发生这个事情的原因是因为,虽然恶意网站看不到你的cookies,但是与你银行相关的cookies仍然会一起在请求中被发送出去。

更糟糕的是,这整个过程可以使用JavaScript自动触发。这意味着,你可能都不需要点击一个按钮。所以,我们该如何在这类攻击中保护我们自己呢?



同步令牌模式

这个问题其实是从银行的网站发出的HTTP请求和从恶意网站发送出的请求是完全一样的。这意味着我们没有办法拒绝来自恶意网站的请求同时又允许来自银行网站的请求。

为了抵御CSRF攻击,我们需要确保在请求中的某些东西是恶意网站无法提供的。


一个解决方案就是使用同步令牌模式。这个方案是确保每个请求,除了我们的session cookie,还要有一个随机生成的令牌作为HTTP参数。当一个请求被提交,服务器必须查找

这个参数所期望的值,并且与请求中的该参数进行对比,如果这两个参数对应不上,那么请求就会失败。


我们可以放宽期望,只要求每个HTTP请求中的这个令牌更新状态。这可以被安全的处理,因为 同源策略 确保了恶意网站无法读取服务器的响应。(可以搜索下同源策略相关资料,这个确保了恶意网站无法读取银行页面上的token,即使token可以在客户端被显示的看到)然后,我们不希望在HTTP GET中包含这个随机的令牌,因为这样会导致令牌的泄露。


让我们看看我们的例子发生了什么变化。假设这个随机生成的令牌显示在一个名称为_csrf的HTTP参数中。例如,转账的请求可能看起来像下面这样:

POST /transfer HTTP/1.1
Host: bank.example.com
Cookie: JSESSIONID=randomid; Domain=bank.example.com; Secure; HttpOnly
Content-Type: application/x-www-form-urlencoded

amount=100.00&routingNumber=1234&account=9876&_csrf=<secure-random>
你会注意到我们增加了_csrf参数,这个参数是一个随机值。现在这个恶意的网站将无法正确的猜测这个_csrf参数(这个参数必须在恶意网站中被显示的提供)

这样当服务器对比这个期望的令牌时,这个请求将会失败,转账也就失败了。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值