spring csrf漏洞处理完整代码
时间: 2024-11-03 17:20:10 浏览: 11
Spring Security 的 Cross-Site Request Forgery (CSRF) 漏洞通常涉及到恶意用户利用已登录用户的会话发起未经授权的操作。为了处理这个漏洞,Spring Security 提供了内置的支持,包括CsrfFilter。以下是一个简单的示例,展示了如何配置 Spring Security 以防止 CSRF 攻击:
```java
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CsrfTokenGenerator tokenGenerator;
@Override
protected void configure(HttpSecurity http) throws Exception {
// 配置CSRF保护
http.csrf()
.csrfTokenRepository(csrfTokenRepository())
.and()
.authorizeRequests()
.antMatchers(HttpMethod.POST, "/敏感操作").requireCsrfToken() // 只对特定请求需要验证CSRF令牌
.anyRequest().permitAll() // 其他请求默认允许
.and()
.formLogin()
.loginPage("/login")
.successHandler(customAuthenticationSuccessHandler()) // 自定义登录成功处理
.failureUrl("/login?error=true") // 登录失败重定向地址
.and()
.logout()
.logoutSuccessUrl("/logoutSuccess")
.invalidateHttpSession(true);
}
// 自定义CSRF令牌存储策略
private HttpSessionCsrfTokenRepository csrfTokenRepository() {
return new HttpSessionCsrfTokenRepository() {
@Override
public HttpSessionCsrfToken generateCsrfToken(CookieGenerator cookieGenerator, HttpServletRequest request) {
HttpSession session = request.getSession();
String tokenValue = tokenGenerator.generateToken(request.getRemoteUser());
HttpSessionCsrfToken token = new HttpSessionCsrfToken(CsrfToken.DEFAULT_TOKEN_NAME, tokenValue);
if (session != null) {
session.setAttribute(CsrfTokenUtils.CSRF_TOKEN_SESSION_ATTRIBUTE_NAME, token);
}
return token;
}
};
}
// 自定义登录成功处理
private AuthenticationSuccessHandler customAuthenticationSuccessHandler() {
return new AuthenticationSuccessHandler() {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
throws IOException, ServletException {
// 设置CSRF令牌到响应头
String token = ((HttpSessionCsrfToken) request.getAttribute(CsrfTokenUtils.CSRF_TOKEN_SESSION_ATTRIBUTE_NAME)).getValue();
Cookie cookie = new Cookie(CsrfToken.DEFAULT_CSRF_COOKIE_NAME, token);
cookie.setSecure(/* 是否启用HTTPS */); // 根据实际情况设置
response.addCookie(cookie);
// 省略其他业务逻辑...
super.onAuthenticationSuccess(request, response, authentication);
}
};
}
// ...其他配置...
}
```
这个例子中,我们设置了 `@EnableWebSecurity` 注解来启用Spring Security,并配置了一个 `CsrfTokenGenerator` 生成token。`configure()` 方法中,我们启用了CSRF验证,只对POST请求到"/敏感操作"的路径要求验证token。同时,我们还自定义了登录成功后的CSRF令牌处理。
注意,这只是一个基本示例,实际应用中可能还需要根据具体的环境、API结构以及前端交互调整相应的配置。另外,在部署生产环境时,你还需要确保HTTPS的启用以提供额外的安全保障。
阅读全文