如何防止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攻击的主要内容,如果未能解决你的问题,请参考以下文章