
25.Spring Security中的CSRF(跨站请求伪造)
从刚开始学习Spring Security时,在配置类中一直存在这样一行代码:
//关闭csrf防护
http.csrf().disable();
如果没有这行代码导致用户无法被认证。
这行代码的含义是:关闭csrf防护。
1.什么是CSRF?
CSRF(Cross-site request forgery)跨域请求伪造,也被称为“OneClick Attack”或者 Session Riding。通过伪造用户请求访问受信任站点的非法请求访问。
跨域:只要网络协议,IP地址,端口中任意一个不相同就是跨域请求。
客户端与服务进行交互时,由于http协议本身是无状态协议,所以引入了cookie进行记录客户端身份。在cookie中会存放session id用来识别客户端身份的。
在跨域的情况下,session id可能被第三方恶意劫持,通过这个session id向服务端发起请求时,服务端会认为这个请求是合法的,可能发生很多意想不到的事情
2.Spring Security中的CSRF
从Spring Security4开始CSRF防护默认开启。默认会拦截请求。进行CSRF处理。
CSRF为了保证不是其他第三方网站访问,要求访问时携带参数名为 _csrf 值为 token(token在服务端产生)的内容,如果token和服务器的token匹配成功,则正常访问。
3.实践:
1.复制static中的login.html到template中
2.将SecurityConfig配置中的关闭CSRF防护注释掉
3.给template中的login.html添加命名空间
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
4.到controller控制层去写页面跳转
/**
* @return { java.lang.String}
* @throws
* @Author etern
* @Description //TODO 开启scrf防护后跳转登录页面
* @Date 12:11 2022/2/8
* @Param * @param
**/
@RequestMapping("showLogin")
public String showLogin() {
return "login";
}
5.到SecurityConfig配置中将自定义的登录页面loginPage修改为上面的跳转链接
拦截器放行也需要将showLogin放行
.antMatchers("/showLogin").permitAll()
6.在template中的login.html中添加CSRF需要的token并进行判断
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Title</title>
</head>
<from action="/login" method="post">
<!-- hidden:隐藏域 th:value="${_csrf.token}":获取服务器端产生的token值 th:if="${_csrf}":判断token值是否与服务器中的token值一致 -->
用户名:<br>
密码:<br>
记住我:<br>
</from>
</html>
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Eternal Night
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果