Security+前后端分离CSRF使用

Security+前后端分离CSRF使用

Security默认是开启CSRF保护的,与此类似的是CORS。具体我不是很了解,只知道CORS是管理跨域资源共享使用,CSRF是保护网络攻击的。
开发环境中经常通过API post或者其他请求访问调试,这样子也就说明,可以通过http请求随意访问。因此开启CSRF保护,表示不可通过API post调试工具调试。
这样又出现了另外一个问题,前后端分离的情况下,怎么能通过CSRF调用呢?

Security是由多个过滤器组成,CSRF实现也不例外,它是由CsrfFilter这个过滤器类实现的,CsrfFilter是对保密性的请求拦截,对于(GET|HEAD|TRACE|OPTIONS)是不拦截的。tokenRepository对象是保管toekn值的
源码的处理如下图:
在这里插入图片描述
这里做了六步处理:

  1. 获取本地存储的csrfTken
  2. 验证是否第一个CSRF校验请求,是则创建一个csrfTken保存起来,不是下一步
  3. 在请求request中加入csrfTken属性值
  4. 如果是GET|HEAD|TRACE|OPTIONS请求,通过
  5. 获取request中携带的csrfToken值,名为actualToken
  6. 比对actualToken和csrfTken是否相同,相同通过,不同报错

因此解决办法的思路重点在request。

  1. 首先肯定得过滤一个不需要csrfToken的请求吧
// security配置文件,其余配置不介绍
   /**
     * 拦截请求后的权限设置
     *
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
              // 网络防护忽略请求
                .csrf().ignoringAntMatchers("/user/login")
    }
  1. 这个登录请求成功后,csrfToken会保存在request中
// 在登录成功处理器中保存这个token
/**
 * 获取CSRF密钥
 *   "csrf": {
 *       "headerName": "X-CSRF-TOKEN",  必须是这个作为key
 *       "parameterName": "_csrf", 这个key值目前不清楚为什么获取不到值
 *       "token": ""
 *   },
 *   向前端发送密钥,每次请求写在头信息中,
 *   例如 X-CSRF-TOKEN: 'token',即可保证正常访问
 */
CsrfToken csrfToken = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
  1. 然后将这个值传递到前端,前端保存,在每次请求头中添加这个值即可验证成功
    this.axios.post(`${API_HOST}/login`, obj, {
        headers: {
            'X-CSRF-TOKEN': token
        }
    }).then(function(response) {
        const data = response.data;
    }, function(response) {});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于前后端分离的应用,Spring Security提供了一种处理跨站请求伪造(CSRF)的方式。CSRF攻击是一种利用用户已经认证的身份进行恶意操作的攻击方式,而Spring Security通过在请求中包含一个CSRF令牌来防止此类攻击。 在前后端分离的应用中,前端通常会发送Ajax请求来与后端进行交互。为了防止CSRF攻击,可以在后端配置Spring Security来生成和验证CSRF令牌。 首先,在后端的Spring Security配置文件中,需要将CSRF保护启用。这可以通过以下代码实现: ```java @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) .and() // 其他配置 } ``` 在这个配置中,我们使用了`CookieCsrfTokenRepository`作为CSRF令牌的存储库,并设置`httpOnly`为`false`,允许前端访问该Cookie。你也可以选择其他的存储库,如`HeaderCsrfTokenRepository`。 接下来,在前端的每个请求中,需要包含CSRF令牌。可以通过以下方式获取令牌: ```javascript var token = document.querySelector("meta[name='_csrf']").getAttribute("content"); var header = document.querySelector("meta[name='_csrf_header']").getAttribute("content"); ``` 然后,在每个请求中,将令牌放入请求头中: ```javascript var xhr = new XMLHttpRequest(); xhr.open("POST", url, true); xhr.setRequestHeader(header, token); // 其他请求设置 xhr.send(data); ``` 后端会验证请求头中的CSRF令牌与Cookie中的令牌是否匹配,如果匹配则继续处理请求,否则返回错误。 这样,通过在前端发送请求时包含CSRF令牌,并在后端验证令牌,就可以有效防止CSRF攻击。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

£漫步 云端彡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值