CSRF(Cross-Site Request Forgery),中文名称:跨站请求伪造,缩写为:CSRF或XSRF,它是一种对网站的恶意利用,和XSS不同的是,XSS是利用站点内的信任用户,而CSRF则是通过伪装来自受信任用户的请求来利用受信任的网站。
可以这么理解:攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求。
CSRF能做的事情包括利用你的身份发短信、邮件,进行转账交易,甚至盗取你的账号等。
图片来源于网络:
XSS攻击原理/过程:
假设某银行网站A以GET请求来发起转账握作,转账的地址为www.xxx.com/transfer.do?account={你的账号}&money={转账金额}
而某论坛B上,一个恶意用户上传了一张图片,而图片的地址栏中填的并不是图片的地址,而是上面这个转账地址。
<img src="http://www.xxx.com/transfer.do?accountNum=123&money=100000000">
当你登录网站A后,没有及时登出,这时你访问了论坛B,并点击了这张图片,不幸的事情发生了,你会发现账户里面少了1个小目标……
为什么会这样呢?在你登录银行A时,你的浏览器端会生成银行A的cookie,而当你访问论坛B中这张恶意图片时,页面上的<img>标签需要浏览器发起一个新的HTTP请求,以获得图片资源,当浏览器发起请求时,请求的却是银行A的转账接口,并且会带上银行A的cookie信息,结果银行的服务器收到这个请求后,会认为是你发起的一次转账操作,因此接口请求成功。
当然,绝大多数网站都不会使用GET请求来进行数据更新,因此,攻击者又改进方案:
假设银行将其转账方式改成POST提交,而论坛B恰好又存在一个XSS漏洞,恶意用户在它的页面上植入如下代码:
<form id="aaa" action="http://www.xxx.com/transfer.do" method=“POST" display="none">
<input type="text" name="account" value="123"/>
<input type="text" name="money" value="100000000"/>
</form>
<script>var form = document.forms['aaa’]; form.submit();</script>
CSRF防御措施:
1. 将Cookie设置为HttpOnly
response.setHeader(“Set-Cookie”, “cookiename=cookievalue;HttpOnly”);
2. 使用JWT token进行会话
3. 通过Refer识别
HTTP请求头中有一个属性叫Refer,记录了该HTTP请求的来源地址。后台获取请求头中的Refer的值,判断是否是本网站域名,如果不是就有可能是CSRF攻击,则拒绝该请求。
Spring Security中对CSRF的处理可参考如下文章: Spring Security系列(9)-CSRF详解_云烟成雨TD的博客-CSDN博客_csrf