1. CSRF简介

1.1 CSRF是什么

CSRF(Cross-Site Request Forgery),跨站请求伪造,缩写为:CSRF/XSRF。攻击者通过伪造用户的浏览器的请求,通常是通过诱导用户访问恶意网站来盗取cookie或者token,去访问一个用户曾访问过的网站并发送恶意请求,使目标网站接收并误以为是用户的真实操作而去执行命令。常用于盗取账号、转账、发送虚假消息等。

1.2 攻击流程示意图

整个伪造攻击流程如下图所示。
【网络安全】CSRF攻击及其预防方法 - 图1

2. CSRF检测

一般可以使用抓包工具,如CSRFTester等,捕获到表单请求后,修改Referer或隐藏,然后重新发包,若提交正常通过,则大概率存在CSRF漏洞。

3. CSRF预防方法

3.1 设置SameSite属性

在Cookie字段中增加SameSite属性,该属性有三个值:Strict,完全禁止跨站点cookie,只有当前网页的 url 与请求目标一致,才会带上cookie,这个规则过于严格,可能造成非常不好的用户体验;Lax,跨站点时只会允许a超链接标签,link预加载标签以及get携带cookie;None,不禁止跨站携带cookie,但需要同时设置secure才会生效,而设置secure属性需要在HTTPS协议下使用。这里推荐使用https协议,然后进行SameSite设置。

  1. Set-Cookie: <name>=<value>; SameSite=None; Secure;

3.2 进行Origin和Referer的同源检测

在请求头中,可以检测Origin和Referer字段验证域名与HTTP来源。但前者兼容性较差,IE浏览器部分版本和302重定向时会不包含该字段;后者还不够安全,因为某些组织认为Referer会暴露信息,所以允许将其设置为隐藏,以及某些恶意代码可以修改该字段。在实际使用时,若两者均不存在则建议直接拒绝其请求

3.3 实现CSRF Token

CSRF Token的核心逻辑在于,CSRF攻击基于盗用浏览器的cookie通过服务器验证,但其本身无法拿到cookie以及请求内容,即单纯的CSRF只能让请求中带有cookie但却并不能读取cookie加入到POST或URL中。CSRF Token基于服务端,在客户端请求网页的时候,服务端生成一个token并隐藏渲染到客户端需要提交的表单上,提交后与服务端存储内容对比,若token错误或者缺失token则直接拒绝,缺点是浪费服务器性能以及需要让每一个表单都额外进行一次操作。

3.4 实现双Cookie验证

核心逻辑与CSRF Token相同。而双Cookie验证基于客户端,在正常提交表单时生成一个随机cookie,并将其增加到请求url和cookie上,提交后服务端进行对比,CSRF不能伪造这样的请求,若不一致则可断定为异常请求而拒绝。

3.5 让用户别乱点不明链接

任何能成功的攻击,要么就是程序员乱写,要么就是用户乱点;而前者往往是有限的,但后者却是无限的。让用户稍微学习点网络安全知识,至少加一行小提示,有时候比写一堆文件有效得多。