我在生成XSRF令牌和更新必要的cookie值方面遇到了一些奇怪的行为。当我加载我的网站的登录页时——一个有角度的前端和一个Spring boot后端——会生成一个XSRF令牌。不是很理想,但如果这是正常的和预期的,那么我可以接受。进入登录页时生成的唯一请求是“获取”请求。
在我登录到应用程序之后,它验证第一个XSRF-TOKEN并验证其有效性,然后继续登录。但是,在更改web服务上的XSRF-token之后,会立即生成一个新的CSRF令牌。因此,前端和后端现在不同步。我不知道如何在成功登录后更新XSRF-TOKEN,或者防止它被更改,因为这似乎没有任何好处。。。至少从我读到的来看。
网络安全
@Override
protected void configure(HttpSecurity http) throws Exception {
CsrfHeaderFilter csrfHeaderFilter = new CsrfHeaderFilter();
http.httpBasic()
.authenticationEntryPoint(new AuthenticationFailureHandler())
.and()
.authorizeRequests()
.antMatchers("List of API URI").permitAll()
.anyRequest().authenticated();
// Configurations for CSRF end points
http.httpBasic()
.authenticationEntryPoint(new AuthenticationFailureHandler())
.and()
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.and()
.authorizeRequests()
.antMatchers("Login API URI").permitAll()
.and()
.addFilterAfter(csrfHeaderFilter, CsrfFilter.class);
// Logout configurations
http.logout()
.permitAll()
.logoutSuccessHandler((new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK)));
}
csrf部分被分开,希望csrf令牌只有在随该URI发送后请求时才会生成。情况似乎并非如此。无论向后端发送什么URI,似乎都会调用CSRF Header过滤器。
CSRF头过滤器-必需,因为cookie的域必须更新,以允许前端和后端访问XSRF-TOKEN。
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class
.getName());
if (csrf != null) {
Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
String token = csrf.getToken();
if (cookie == null || (token != null && !token.equals(cookie.getValue()))) {
cookie = new Cookie("XSRF-TOKEN", token);
cookie.setPath("/");
cookie.setDomain(<omitted>);
response.addCookie(cookie);
}
}
filterChain.doFilter(request, response);
}
我相信我的过滤器是如何组织的有一个问题,但是我已经尝试了各种方法,从将不同的http.httpBasic()部分组合成一个单独的组到使用antIgnores for csrf(),再到不处理带有GET请求的CSRF令牌。任何指导或建议将不胜感激!
如果您还需要什么,请告诉我,我会尽力提供。
谢谢
正如我所怀疑的,过滤的顺序有问题。在Spring Boot安全性中建立了一个过滤器层次结构。在将值添加到cookie之前,需要生成XSRF-TOKEN。如果在生成新值之前将旧值添加到Cookie中,则在执行浏览器刷新之前,前端和后端将不同步。
这就是为什么我在过滤顺序的末尾添加了过滤器。如果有人有更好的切入点,我会相应地更新它,并更新这个答案以反映它。
@Override
protected void configure(HttpSecurity http) throws Exception {
CsrfHeaderFilter csrfHeaderFilter = new CsrfHeaderFilter();
http.httpBasic()
.authenticationEntryPoint(new AuthenticationFailureHandler())
.and()
.authorizeRequests()
.antMatchers("List of API URI").permitAll()
.anyRequest().authenticated();
// Configurations for CSRF end points
http.httpBasic()
.authenticationEntryPoint(new AuthenticationFailureHandler())
.and()
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.and()
.authorizeRequests()
.antMatchers("Login API URI").permitAll()
.and()
.addFilterAfter(csrfHeaderFilter, ExceptionTranslationFilter.class);
// Logout configurations
http.logout()
.permitAll()
.logoutSuccessHandler((new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK)));
}
问题内容: 我正在尝试使用Elasticsearch来实现自动完成功能,因为我知道该怎么做… 我正在尝试在索引已爬网数据时使用ES的edge_n_grams建立多词(短语)建议。 a 和a 之间有什么区别-我已经阅读了有关这些文档,但仍需要更多了解…。 例如,token_filter是ES用来针对用户输入进行搜索的内容吗?ES用于制作令牌的令牌生成器是吗?什么是代币? ES是否可以使用其中任何一种
基本上,我正在尝试创建一个随机的车牌,其中包含三个大写字母(65,ASCII码)和三个数字。当我运行程序时,我得到了一个异常,即静态int z=Integer。parseInt(y) 。所以基本上我所做的是,我将字符串数组转换为字符串,然后将字符串转换为int,再将int转换为char,然后我做了一个while循环(如果字母不等于b),那么它应该可以工作。 你能帮帮我吗?还有,我应该有两种方法吗?
问题内容: 我正在尝试从CSRF保护应用程序(PHP和许多JS)。 我想使用令牌。 AJAX完成了许多操作,因此我必须在Javascript中传递令牌。如果我想为每个会话或每个页面加载生成1个令牌,这很简单- 我生成一个新令牌,将其放在DOM中的某个位置,然后使用Javascript查找并发送到处理端。 但是,如果我想为每个操作使用新令牌怎么办?我正在考虑进行ajax调用以重新生成令牌,然后将结果
问题内容: 我有2个html页面。 父页面和子页面。子页面包含一个提交按钮,该按钮在父页面上运行代码以提交Ajax消息。 我使用$ .load()方法加载子页面,然后在单击按钮时运行$ .ajax .POST方法。此post方法仅将JSON字符串传递给Python代码。 当我在除IE以外的任何浏览器上执行此操作时,它工作正常。但是,当我在IE中运行此代码时。我收到有关CSRF令牌的Python /
问题内容: 在此问题中, 有一个功能要求,要求使用可选种子进行订购,以允许随机订购。 我需要能够对随机排序的结果进行分页。用Elasticsearch 0.19.1怎么做? 谢谢。 问题答案: 您可以使用唯一字段(例如id)和随机盐的哈希函数进行排序。根据结果的真实程度,您可以执行以下原始操作: 或像 第二个示例将产生更多随机结果,但速度会稍慢。 为了使这种方法起作用,必须存储字段。否则,查询
本页描述了解释CSRF攻击的用例(16.1): https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html 但是,如果用户确实登录了银行的网站,那么邪恶的网站难道不可能发出GET请求以获取新的CSRF令牌,并在根本不需要用户的情况下撰写帖子吗? 答案必须是否定的,否则CSRF令牌将毫无用处,但我