一、CSRF是什么?
CSRF(Cross-site request forgery)跨站请求伪造,是一种常见的web安全漏洞,概括地说就是指,攻击者通过浏览器保存的Cookie盗用了你的身份,以你的名义给某个网站发送恶意请求,这些恶意请求包括但不限于发邮件、修改账户信息、购买商品、转账等等,如果这个网站没有防御csrf攻击的话,那么这些恶意请求可能会请求成功,从而泄露了个人的隐私安全和财产安全。
二、CSRF的原理
- 浏览并登录受信网站WebA。
- 验证通过,浏览器端产生WebA的cookie。
- 用户在没有登出WebA的前提下访问了危险网站Web。
- Web发出一个对WebA的恶意请求。
- 根据4中的请求,浏览器带着还未失效的cookie访问WebA。
- WebA并不知道该请求是用户发出的还是WebB发出的,当权限校验通过后,WebB就达到了模拟用户操作的目的。
所以,当你在不登出受信网站(即cookie依然有效)的情况下,访问了恶意网站,那么就有可能发生CSRF攻击。
备注:不一定非要访问那些恶意网站,也许会是一个有其他漏洞的受信网站,恶意攻击者也可能会以这个网站作为中间网站实施攻击。
三、CSRF的防御
我们知道了CSRF攻击的原理,就可以做针对性的防御了。CSRF的防御可以从两个方面考虑,一个是后台接口层;另一个则是在前端做防御,这种不同源的请求,不可以带cookie。
后端防御:
后端防御主要是区分哪些请求是恶意请求,哪些请求是自己网站的请求。区分恶意请求的方式有很多。例如:
- CSRF Token的方式。这种方式在表单页面生成一个随机数,这个随机数一定要后端生成,并且对这个随机数进行存储。在前端页面中,对这个Token表单项进行隐藏。
- 通过请求头中的referer字段判断请求的来源。每一个发送给后端的请求,在请求头中都会包含一个referer字段,这个字段标识着请求的来源。如果请求是从该网站发出的,这个字段会是该网站跳转的链接;如果不是则直接忽略掉这个请求。
前端防御CSRF:
谷歌提出了same-site cookies概念,same-site cookies是基于Chrome和Mozilla开发者花了三年多时间制定的IETF标准。它是在原有的Cookie中,新添加了一个SameSite属性,它标识着在非同源的请求中,是否可以带上Cookie,它可以设置为3个值,分别为:
- Strict
- Lax
- None
Strict是最严格的,它完全禁止在跨站情况下,发送Cookie。只有在自己的网站内部发送请求,才会带上Cookie。不过这个规则过于严格,会影响用户的体验。
Lax的规则稍稍放宽了一些,大部分跨站的请求也会带上Cookie,但是一些导航的Get请求会带上Cookie。
None就是关闭SameSite属性,所有的情况下都发送Cookie。不过SameSite设置None,还要同时设置Cookie的Secure属性,否则是不生效的。