如何防止CSRF攻击

Posted vieber

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何防止CSRF攻击相关的知识,希望对你有一定的参考价值。

什么是CSRF

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

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

  • 受害者登陆a.com,并保留了登陆凭证(cookie)
  • 攻击者引诱受害者访问了b.com
  • b.com向a.com发送了一个请求: a.com/act=xxx。浏览器会默认携带a.com的cookie
  • a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误认为是受害者自己发送的请求
  • a.com以受害者的名义执行了act=xxx
  • 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作

几种常见的攻击类型

GET类型的csrf

GET类型的CSRF非常简单,只需要一个http请求即可,一般会这样利用。

https://a.com/mit-x/blog-images-bundle-2018b/ff0cdbee.example/withdraw?amount=10000&for=hacker

在受害者访问含有这个img的页面后,浏览器会自动向这个地址发出一次HTTP请求。

post类型的csrf

这种类型的csrf利用起来通常是一个自动提交的表单,如:

<form method="post" action="https://bank.example/withdraw"> 
   <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>

访问该页面后,表单会自动提交,相当于一次模拟post请求。
post类型的攻击通常比get要求更严格一些,但是并不复杂,任何个人网站,博客,被黑客上传的页面网站都有可能是攻击的来源,后端接口不能将安全寄托在仅允许post上面。

链接类型的csrf

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

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

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

CSRF的特点

  • 攻击一般发起在第三方网站,而不是被攻击的网站,被攻击的网站无法预防发生
  • 攻击者利用受害者的凭证进行请求操作,而不是直接窃取数据
  • 整个过程并不能获取受害者的登陆凭证,仅仅是冒用
  • 跨站请求可以用各种方式:图片URL、超链接、CORS、Form提交等等。部分请求方式可以直接嵌入第三方论坛、文章中,难以追踪。
    CSRF通常是跨域的,因为外域通常更容易被攻击者掌握,但是如果本域下有容易被利用的功能,比如可以发图和链接的论坛和评论区,攻击者可以在本域进行,这样更加危险。

防护策略

CSRF通常从第三方网站发起,被攻击的网站无法防止攻击发生,只能通过增加自己网站对CSRF的防护能力来提升安全性

  • CSRF通常发生在第三方域名
  • CSRF攻击者不能获取到cookie,只能使用
    针对这两点,我们可以采用以下策略:
  • 阻止不明外域的访问
    • 同源检测
    • Samesite cookie
  • 提交时要求附加本域才能获取的信息
    • CSRF token
    • 双重cookie验证
      以下是我们的详细说明

同源策略

既然csrf大多来自第三方网站,那我们就直接禁止不受信任的域名对我们发起请求。

那么我们如何判断请求是否来自外域呢?
在http协议中,每个异步请求都会携带两个header,用户标记来源域名

  • origin Header
  • Referer Header
    这两个Header在浏览器发起请求时,大多数情况会自动带上,并且不能由前端自定义内容,服务器可以通过解析这两个header中的域名,确定请求的来源域。

以上是关于如何防止CSRF攻击的主要内容,如果未能解决你的问题,请参考以下文章

防止跨站攻击——CSRFToken

什么是CSRF 攻击

CSRF攻击原理

如何预防CSRF攻击?可以试试这三种方式

csrf攻击

关于csrf