文章配套代码:https://gitee.com/lookoutthebush/spring-security-demo
一、CSRF
CSRF的全称是(Cross Site Request Forgery),可译为跨域请求伪造,是一种利用用户带登录 态的cookie进行安全操作的攻击方式。CSRF实际上并不难防,但常常被系统开发者忽略,从而埋下巨 大的安全隐患。
二、攻击过程
举个例子,假设你登录了邮箱,正常情况下可以通过某个链接http:xx.mail.com/send可以发送邮件。此时你又访问了别的网站,网站中有黄色广告,点击后广告会请求http:xx.mail.com/send。此时相当于在盗版网站中调用了发送邮件的链接,访问时会使用你邮箱网站的cookie信息。虽然盗版网站会提示跨域,但服务端任然进行了相应处理。
三、防御手段
在任何情况下,都应当尽可能地避免以GET方式提供涉及数据修改的API。并不是说其他请求方式可以避免CSRF,只是GET请求更容易被攻击。
在此基础上,防御 CSRF攻击的方式主要有以下两种。
1.HTTP Referer
Http referer是由浏览器添加的一个请求头字段,用于标识请求来源,浏览器端无法轻易篡改该值。
比如攻击者在第三方页面构造了POST请求,htttp referer不是我们网站的地址(有的老版IE浏览器可以修改该值,如果用户的浏览器比较新,就能避免这个问题),当服务端收到请求,发现请求来自其他站点,就能拒绝该请求。
这种方式简单便捷,但不是完全可靠,比如老的浏览器就能修改该值。用户在浏览器设置了不被跟踪,就不会有该字段,服务端加了校验后就会拦截掉用户的正常请求。
2.CsrfToken认证
CSRF是利用用户的登录态进行攻击的,而用户的登录态记录在cookie中。其实攻击者并不知道用 户的cookie存放了哪些数据,于是想方设法让用户自身发起请求,这样浏览器便会自行将cookie传送到 服务器完成身份校验。
CsrfToken 的防范思路是,添加一些并不存放于 cookie 的验证值,并在每个请求中都进行校验, 便可以阻止CSRF攻击。
具体做法是在用户登录时,由系统发放一个CsrfToken值,用户携带该CsrfToken值与用户名、密码 等参数完成登录。服务端记录该会话的CsrfToken值,之后在用户的任何请求中,都必须带上该 CsrfToken值,并由系统进行校验。
该方案需要前端配合,包括存储CsrfToken的值,在每次的请求中,不管是form表单还是ajax,都需要携带该token。虽然比HTTP Referer安全很多,但也有弊端,如果在已有系统进行改造,就需要修改每一个请求,所以建议在系统开发之初就考虑防御CSRF攻击。
三、使用SpringSecurity防御CSRF
csrf攻击完全是基于浏览器的,如果前端没有浏览器,也就不会有CSRF攻击了,所以我们需要关闭SpringSecurity自动配置的csrf。

1.SpringSecurity防御CSRF过程
CsrfFilter:
Sp

本文详细介绍了CSRF攻击原理、防御手段,特别是如何在Spring Security框架中实施CsrfToken认证来防止CSRF。通过HttpSessionCsrfTokenRepository和CookieCsrfTokenRepository的对比,展示了两种存储token方式及其安全性分析。
最低0.47元/天 解锁文章
1772

被折叠的 条评论
为什么被折叠?



