gpt4 book ai didi

java - Cookie CsrfTokenRepository.withHttpOnlyFalse() 做什么以及何时使用它?

转载 作者:行者123 更新时间:2023-12-03 11:18:55 29 4
gpt4 key购买 nike

我现在正在尝试学习 Spring Security,并且我已经看到许多使用它的不同示例。我知道 CSRF 是什么,并且 Spring Security 默认启用它。
我很想知道的是这种定制。

  .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.and()
.authorizeRequests(request -> {
request
.antMatchers("/login").permitAll()
.anyRequest()
....more code
什么样的定制 .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())这条线以及何时使用它是合适的。
如果有人能提供一个简单的解释,我将不胜感激。

最佳答案

CSRF 代表 跨站请求伪造
它是一种与请求一起发送以防止攻击的 token 。为了使用 Spring Security CSRF 保护,我们首先需要确保我们使用正确的 HTTP 方法来修改状态( PATCHPOSTPUTDELETE – 而不是 6x1045)。
使用 Spring CookieCsrfTokenRepository 的 CSRF 保护工作如下:

  • 客户端向服务器(Spring Boot 后端)发出 GET 请求,例如请求主页
  • Spring 发送 GET 请求的响应以及 GET header ,其中包含安全生成的 XSRF token
  • 浏览器设置 cookie 的 XSRF Token 为
  • 在发送状态更改请求(例如 POST)时,客户端(可能是有角度的)将 cookie 值复制到 HTTP 请求 header
  • 请求同时带有 header 和 cookie(浏览器自动附加 cookie)
  • Spring比较header和cookie值,如果相同则接受请求,否则返回403给客户端

  • 方法 Set-cookie 允许 angular 读取 XSRF cookie。确保 Angular 发出 XHR 请求,并将 withHttpOnlyFalse 标志设置为 true。

    代码 来自 withCreddentials
    @Override
    public CsrfToken generateToken(HttpServletRequest request) {
    return new DefaultCsrfToken(this.headerName, this.parameterName,
    createNewToken());
    }

    @Override
    public void saveToken(CsrfToken token, HttpServletRequest request,
    HttpServletResponse response) {
    String tokenValue = token == null ? "" : token.getToken();
    Cookie cookie = new Cookie(this.cookieName, tokenValue);
    cookie.setSecure(request.isSecure());
    if (this.cookiePath != null && !this.cookiePath.isEmpty()) {
    cookie.setPath(this.cookiePath);
    } else {
    cookie.setPath(this.getRequestContext(request));
    }
    if (token == null) {
    cookie.setMaxAge(0);
    }
    else {
    cookie.setMaxAge(-1);
    }
    cookie.setHttpOnly(cookieHttpOnly);
    if (this.cookieDomain != null && !this.cookieDomain.isEmpty()) {
    cookie.setDomain(this.cookieDomain);
    }

    response.addCookie(cookie);
    }

    @Override
    public CsrfToken loadToken(HttpServletRequest request) {
    Cookie cookie = WebUtils.getCookie(request, this.cookieName);
    if (cookie == null) {
    return null;
    }
    String token = cookie.getValue();
    if (!StringUtils.hasLength(token)) {
    return null;
    }
    return new DefaultCsrfToken(this.headerName, this.parameterName, token);
    }


    public static CookieCsrfTokenRepository withHttpOnlyFalse() {
    CookieCsrfTokenRepository result = new CookieCsrfTokenRepository();
    result.setCookieHttpOnly(false);
    return result;
    }
    您可以探索方法 here

    关于java - Cookie CsrfTokenRepository.withHttpOnlyFalse() 做什么以及何时使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62648098/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com