44. CSRF 攻击与防御
Posted 全端学堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了44. CSRF 攻击与防御相关的知识,希望对你有一定的参考价值。
CSRF 是 Cross Site Request Forgery 的缩写,中文意思是跨站请求伪造,这个漏洞往往能给用户带来巨大的损失,但是在实际的网站中,很多都没有做 CSRF
的防御,本文就带大家来了解一下 CSRF
的攻击原理与防御办法。
举个栗子
假如小明需要使用在线支付业务,支付网站的域名为 http://www.my-pay.com
,支付网站提供了一个在线支付的功能页面,源代码片段如下:
<form method="post" action="/pay">
<input type="text" name="account"/>
<input type="text" name="money"/>
<input type="submit" value="支付"/>
</form>
页面提供了一个表单,表单中有两个输入框,一个输入对方账户,一个输入支付金额,还有一个支付按钮。小明登录了支付网站,输入对方账户(xiaohong
)及支付金额(199),点击支付按钮,向支付网站的后端发送请求,比如请求内容为:
POST http://www.my-pay.com/pay HTTP/1.1
Host: www.my-pay.com
Cookie: JSESSIONID=1234567890
Content-Type: application/x-www-form-urlencoded
account=xiaohong&money=199
请求成功后,小明账户中的 199 元就支付进入了 xiaohong
账户中。(当然实际的支付网站不会这么简单,业务会更加复杂,也会更安全)
小明支付成功后,并没有退出支付网站的登录,这时,他看到另一个网页中(诱导页面)有“领取支付红包 15.37 元”的按钮,这个按钮的背后其实是这样一段代码片段:
<form method="post" action="http://www.my-pay.com/pay">
<input type="hidden" name="account" value="黑客的账户"/>
<input type="hidden" name="money" value="1999.00"/>
<input type="submit" value="领取支付红包 15.37 元"/>
</form>
可以看到,在表单中的账户及金额都是被隐藏起来的,只显示一个“领取支付红包 15.37 元”的按钮,当小明忍不住冲动的点击了一下这个按钮时,会发生什么呢?
小明本来是想“领取支付红包 15.37 元”,结果却是向黑客支付了 1999 元,这就是典型的 CSRF
攻击。
攻击原理
将上述例子使用如下图示来描述:
一个典型的 CSRF
攻击流程是这样的:
- 受害者登录受信网站 A
- 网站 A 将用户的登录凭证保存到客户端浏览器的
cookie
中 - 攻击者引诱受害者访问黑客站点 B
- 黑客站点 B 向受害者发送一个伪装页面,页面中包含要求访问站点 A 的代码片段
- 受害者打开伪装页面(或者点击页面中的某个按钮)触发对站点 A 的访问,这时浏览器会携带受害者在 A 域下
cookie
中保存的登录凭证到站点 A 的服务器 - 站点 A 接收到请求后,对请求进行验证,并确认是受害者的登录凭证,误以为是受害者自己发送的请求
- 站点 A 以受害者的名义执行了攻击操作
- 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让站点 A 执行了自己定义的操作,使受害者蒙受损失
这就是 CSRF
攻击的原理,如果你网站中的用户没有退出登录,攻击者就可以利用这些用户伪造请求,并发送一些敏感的操作请求,比如:支付、转账、购物等,那么将为你网站的用户带来巨大的损失。
防御措施
CSRF
通常从第三方网站发起,被攻击的网站无法防止攻击发生,只能通过增强自己网站针对 CSRF
的防御能力来提升安全性。
通过 CSRF
攻击原理的介绍,我们知道 CSRF
有两个特点:
CSRF
(通常)发生在第三方域名CSRF
攻击者不能获取到cookie
等信息,只能使用
可针对 CSRF
的这两个特点,专门制定防御策略,通常有如下几种方式:
- 阻止不明外域的访问
- 同源检测:在请求头中携带
Origin Header
与Referrer Header
以便判断是否为同源请求 Samesite Cookie
:当Samesite Cookie
被设置为Strict
时,浏览器在任何跨域请求中都不会携带Cookie
,新标签重新打开也不携带,所以说CSRF
攻击基本没有机会- 提交时要求附加本域才能获取的信息
CSRF Token
:要求所有的用户请求都携带一个CSRF
攻击者无法获取到的Token
,服务器会校验请求是否携带正确的Token
- 双重
cookie
验证:在用户访问网站页面时,向请求域名注入一个内容随机的Cookie
,当前端向后端发起请求时,取出Cookie
,并添加到URL
的参数中,由后端接口验证Cookie
是否一致
对这些防御措施,在此就不一一展开了,如果大家对防御措施感兴趣,可自行查阅相关文档。
以上是关于44. CSRF 攻击与防御的主要内容,如果未能解决你的问题,请参考以下文章