SpringBoot防御CSRF攻击的流程及原理解析 |
||||||||||||||||||
+ 目录 CSRF 就是跨域请求伪造,英文全称是 Cross Site Request Forgery。 今天和大家聊一聊什么是 CSRF 攻击以及 CSRF 攻击该如何防御。
CSRF 原理想要防御 CSRF 攻击,那我们需要先搞清楚什么是 CSRF 攻击,通过下面图例来和大家梳理 CSRF 攻击流程:
其实这个流程很简单: CSRF的流程大致就是这样,接下来用一个简单的例子展示一下CSRF到底是怎么一回事。
CSRF实践1.我创建一个名为 csrf-mry 的 Spring Boot 项目,这个项目相当于我们上面所说的网上银行网站,创建项目时引入 Web 和 Spring Security依赖,如下:
?
2.创建成功后,方便起见,我们直接将 Spring Security 用户名/密码 配置在 application.properties 文件中:
?
3.然后我们提供两个测试接口
?
假设 /transfer 是一个转账接口(这里是假设,主要是给大家演示 CSRF 攻击,真实的转账接口比这复杂)。 4.我们还需要配置一下 Spring Security,因为 Spring Security 中默认是可以自动防御 CSRF 攻击的,所以我们要把这个关闭掉。
?
配置完成后,我们启动 csrf-simulate-web 项目。 5.我们再创建一个 csrf-loophole-web 项目,这个项目相当于是一个危险网站,为了方便,这里创建时我们只需要引入 web 依赖即可。
?
6.然后我们在 resources/static 目录下创建一个 hello.html ,内容如下。
?
这里有一个超链接,超链接的文本是点击查看美女图片,当你点击了超链接之后,会自动请求 http://localhost:8866/transfer 接口,同时隐藏域还携带了两个参数。 配置完成后,就可以启动 csrf-loophole-web 项目了。 接下来,用户首先访问 csrf-simulate-web 项目中的接口,在访问的时候需要登录,用户就执行了登录操作,访问完整后,用户并没有执行登出操作,然后用户访问 csrf-loophole-web 中的页面,看到了超链接,好奇这美女到底长啥样,一点击,结果钱就被人转走了。
CSRF防御先来说说防御思路。 CSRF 防御,一个核心思路就是在前端请求中,添加一个随机数。 因为在 CSRF 攻击中,黑客网站其实是不知道用户的 Cookie 具体是什么的,他是让用户自己发送请求到网上银行这个网站的,因为这个过程会自动携带上 Cookie 中的信息。 所以我们的防御思路是这样:用户在访问网上银行时,除了携带 Cookie 中的信息之外,还需要携带一个随机数,如果用户没有携带这个随机数,则网上银行网站会拒绝该请求。黑客网站诱导用户点击超链接时,会自动携带上 Cookie 中的信息,但是却不会自动携带随机数,这样就成功的避免掉 CSRF 攻击了。 Spring Security 中对此提供了很好的支持,我们一起来看下。
前后端不分离方案 Spring Security 中默认实际上就提供了 csrf 防御,但是需要开发者做的事情比较多。 1.pom信息
?
2.项目创建成功后,我们还是在 application.properties 中配置用户名/密码
?
3.接下来,我们提供一个测试接口
?
|