springsecurity的防CSRF的功能是开启的,一般也建议开启。
CSRF的原理
CSRF攻击原理比较简单,例如Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。
用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;并且,此后从用户浏览器发送请求给网站A时都会默认带上用户的Cookie信息;
2)用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
3)网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
4)浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求的最终发起者其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
简单来说,CSRF必须经过两个步骤:
1、用户访问可信任站点A,并产生了相关的cookie;
2、用户在访问A站点时没有退出,同时访问了危险站点B。
先讲一下,springsecurity的防CSRF的基本原理:
1.一般用户向服务器请求登录,服务器会返回一个登录的表单页面,实际上这时候服务器就已经保存了一串随机生成的字符串A
2.返回给用户的登录表单页面中,有一个隐藏域,值就是字符串A
3.当用户提交表单时,隐藏域中的字符串A和服务器上的字符串A比较,一般来说都是相同的,此时服务器就认为是用户本人操作
这里的关键实际上就是这一串字符串A了,在请求登录页面的时候就已经保存一份在服务器了,然后给用户一份。一些恶意网站可以拿到用户在服务器认证过的cookie,但是拿不到这个这个字符串A
如果csrf功能开启了,那么在表单页面中,需要加上下面一段的(前提得有thymeleaf的jar包):
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">