如何防止CSRF攻击?

 一、信息安全背景

CSRF攻击属于前端安全系列,信息安全问题是企业最为关注的焦点之一,而前端又是引发企业安全问题的的高危据点,在移动互联网时代,前端人员除了XSS、CSRF等安全问题之外,又时常遭遇网络劫持,非法调用Hybrid API等新型安全问题,当然,浏览器自身也在不断更新进步,不断引入CSP,Same-Site Cookies等新技术来增强安全性,但仍然存在很多潜在的威胁,这需要前端技术人员不断地学习进行查缺补漏。

二、CSRF漏洞的发生?

相比于XSS,似乎很多人认为CSRF的攻击性没有那么大,但真的是这样吗?

A同学出场,我们看看一个例子:

A在无聊之际,悠闲的刷着Gmail邮件,大部分都是一些没营养的通知什么的,但有一份比特币的邮件引起了A的注意:

聪明的A当然知道这是骗子,但还是抱着好奇的心态点了进去(请勿模仿),果然,进去之后是一个什么都没有的空白页面,A失望的关闭了页面,一切似乎什么都没发生.......但在平静的外表下,黑客的攻击已经悄然而至,A的Gmail中,被偷偷设置了一个过滤规则,这个规则会将A所有的邮件被自动转发到一个指定的邮箱,不久后的一天,A发现自己的域名已经被转让了,懵圈的A以为是自己域名到期自己忘记了续费,直到有一天,对方开出$650的赎回价码,A才开始觉得不对劲,A仔细查看了域名的转让,对方是拥有自己的验证码的,而域名的验证码只存在于自己的邮箱中,A回想起那天奇怪的链接,打开后查看了“空白页”的源码:

<form method="POST" action="https://mail.google.com/mail/h/ewt1jmuj4ddv/?v=prf" enctype="multipart/form-data"> 
    <input type="hidden" name="cf2_emc" value="true"/> 
    <input type="hidden" name="cf2_email" value="hacker@hakermail.com"/> 
    .....
    <input type="hidden" name="irf" value="on"/> 
    <input type="hidden" name="nvp_bu_cftb" value="Create Filter"/> 
</form> 
<script> 
    document.forms[0].submit();
</script>

如上代码所示,可以看到,该页面只要打开,就会向Gmail发送一个post请求,请求中,执行了“Create Filter”命令,将所有邮件转发到“hacker@hakermail.com”,A由于刚刚就登录了Gmail,所以这个请求发送时,携带着A的登录凭证(Cookie),Gmail的后台接收到请求,验证了确实有A的登录凭证,于是成功给A配置了过滤器,黑客可以查看A的所有邮件,包括邮件里的域名验证码等隐私信息,拿到验证码后,黑客就可以要求域名服务商把域名重置给自己。A很快打开Gmail,找到了那条过滤器,将其删除,然而,已经泄露的邮件都到被已转让的域名了,也挽回不了了........(此件的原型是2007年Gmail的CSRF的漏洞,当然此漏洞已经被修复,使用Gmail的用户不用慌张)

三、什么是CSRF? 

CSRF(Cross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户被攻击的网站执行某项操作的目的。

一个典型的CSRF攻击有着如下流程:

1、受害者登录a.com,并保留了登录凭证(Cookie)

2、攻击者通过链接或者其他方式引诱受害者访问了b.com

3、b.com向a.com发送了一个请求:a.com/act=xx,浏览器回默认携带a.com的Cookie

4、a.com接收到请求后,对请求进行验证并确定是受害者的凭证,误以为是自己发送的请求

5、a.com以受害者的名义执行了act=xx

6、攻击完成,攻击者在受害者不知情的情况下,冒充受害者让a.com执行了自己定义的操作

四、几种常见的攻击类型?

Get类型的CSRF攻击,只需要一个HTTP请求,一般会这样利用:

 ![](https://awps-assets.meituan.net/mit-x/blog-images-bundle-2018b/ff0cdbee.example/withdraw?amount=10000&for=hacker)

在受害者访问含有这个img的页面后,浏览器会自动向 发出一次HTTP请求,bank.example就会收到包含受害者登录信息的跨域请求。

 Post类型的CSRF攻击,通常是使用一个自动提交的表单,访问 该页面后,表单会自动提交,相当于模拟用户完成了一次Post操作,Post类型的攻击通常比Get攻击更加严格一些,单并不复杂,任何个人网站、博客、被黑客上传页面的网站都有可能是发起攻击的来源,后端接口不能将安全寄托在仅允许Post上面。

 <form action="http://bank.example/withdraw" method=POST>
    <input type="hidden" name="account" value="xiaoming" />
    <input type="hidden" name="amount" value="10000" />
    <input type="hidden" name="for" value="hacker" />
</form>
<script> document.forms[0].submit(); </script> 

 链接类型的CSRF攻击,链接类型的比起前面两种并不常见,这种需要用户点击链接才会触发,一般是在论坛中发布的图片中嵌入恶意链接,或者以广告的形式诱导用户中招,攻击者通常会以比较夸张的词语诱导用户点击。

  <a href="http://test.com/csrf/withdraw.php?amount=1000&for=hacker" taget="_blank">
  重磅消息!!
  <a/>

由于之前用户登录了信任的网站A,并且保存了登录状态,只要用户主动访问上面的这个PHP页面,则表示攻击成功。

CSRF通常是跨域的,因为外域通常容易被攻击者掌控,但是如果本域下有容易被利用的功能,比如可以发图或链接的论坛或者评论区,攻击者直接可以在本域下进行,而且这种攻击更加危险。

五、防护策略

CSRF通常从第三方网站发起,被攻击的网站无法防止攻击发生,只能通过增强自己网站针对CSRF的防护能力来提升安全性。CSRF的攻击主要从两个方面来防护,策略如下:

1、阻止不明外域的访问

  • 同源检测
  • Samesite Cookie

2、提交时要求附加本域才能获取信息

  • CSRF Token
  • 双重Cookie验证

下章详细聊聊以上防护措施的具体实现

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值