CSRF定义
https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)
主要原因:不合法的CORS请求的结果虽然会被浏览器阻止,但是整个http请求是完成的(且请求带有域的cookie)
举例,一个URL是银行转账操作,参数是金额和需要转账的户头。把这个url放在黑客网站的<img src="">中,虽然黑客网站不能获取这个URL的返回,但是整个http请求已经完成了,转账也完成了。
防范方法
- 判断请求的referer。不过这个方法不够好,因为不能100%保证UA发送过来的referer是安全的。
- 使用CSRF token。这是一个随机数,存储在用户session中,用户的每个请求都验证这个token。
Spring security 与 CSRF token
https://docs.spring.io/spring-security/site/docs/5.1.6.RELEASE/reference/htmlsingle/#csrf
spring security中的CSRF token是一个随机字符串,用户登录成功后,存在session中。
主要由两种情况:
- 表单请求。在表单中加入hidden的input filed,value是CSRF token(通过模板渲染的方式,将session中的CSRF token值赋给这个input field)
- AJAX请求。依然是通过模板渲染,在html中有一个meta标签:
<meta name="_csrf" content="${_csrf.token}"/> 在每次AJAx 请求的时候,添加请求头X-CSRF-TOKEN(天加请求头的操作需要开发者自己完成),spring secuirty会校验每个请求中的该请求头的值是否与session中的一致
需要注意的时,不能让黑客通过脚步注入攻击,获取到这个token。
其他参考资料