CSRF(跨站请求伪造)攻击原理与防御方案
CSRF: 跨站请求伪造
攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求
攻击流程
用户登录A.com ---> 访问B.com ---> B.com发起请求A.com(携带cookie) ---> 因为cookie作身份认证,A服务器以为是A自己发送的请求,故接受该请求
CSRF防范手段
- 同源检测:请求头referer(当前完整url)、origin字段
- 设置cookie的SameSite为strict或者lax,该属性可以让 Cookie 在跨站请求时不会被发送,从而可以阻止跨站请求伪造攻击(CSRF)【不支持IE】
(详见cookie字段详解) (sameSite属性lax说明表)
- csrf-token验证
用户登录输入账号密码,请求登录接口,后端在用户登录信息正确的情况下将token放到后端session中,并返回token给前端,前端把token 存放在localStorage/sessionStorage中,之后再发送请求将token放到header中
- 由于同源策略,第三方网站是拿不到localStorage/sessionStorage的
两种常见的csrf攻击类型
1. 跨域get请求:利用a/img/script等DOM标签请求(仅IE会跨域携带cookie)
html
<img src="http://A.com/api" >
<a src="http://A.com/api" > test </a>
<script src="http://A.com/api"></script>
<!-- 在非同源下,不受同源策略影响可以正常请求 -->
经测试:
在chrome95中,无论SameSite为何值,三个标签都不会携带A.com的cookie。在IE11中测试都会带上A.com的cookie
结论:
都是get请求,现代开发模式get用于请求资源,一般造不成实际伤害
2. 跨域post请求:表单提交【不存在跨域问题】
- form 提交(submit)之后,是不会有任何数据返回的,没机会读任何东西,所以可以认为是无害的,不在同源策略之内。 而 AJAX 是可以读取响应内容的,因此浏览器的同源策略不允许这样的行为。
html
<!-- 例如在A.com下请求 -->
<form action="http://B.com/api" 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>
经测试,可以正常请求跨域地址B.com,但是不会携带发起请求站点A.com的cookie。
chrome中cookie的
sameSite为none时
会携带B.com的cookie。由于IE不支持SameSite属性,所以会发送cookie