CSRF防护
Spring Boot 中启用 CSRF 防护
CSRF(跨站请求伪造)是一种常见的安全威胁,Spring Security 提供了内置的 CSRF 防护功能。在 Spring Boot 应用中启用 CSRF 防护有以下几种方式:
- 默认启用(推荐)
Spring Security 5.x 默认启用了 CSRF 防护。如果你使用的是默认配置,通常不需要额外操作。
- 显式配置
如果需要自定义 CSRF 配置,可以通过以下方式:
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.csrf.CookieCsrfTokenRepository;
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
// 可以在这里配置需要排除CSRF保护的路径
.ignoringRequestMatchers("/api/public/**")
)
// 其他安全配置...
.authorizeHttpRequests(auth -> auth
.requestMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/login")
.permitAll()
)
.logout(logout -> logout
.permitAll()
);
return http.build();
}
}
- 禁用 CSRF(不推荐)
如果确实需要禁用 CSRF(例如仅提供无状态 API),可以这样配置:
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable())
// 其他配置...
return http.build();
}
- 表单中使用 CSRF 令牌
在 Thymeleaf 模板中自动包含 CSRF 令牌:
<form method="post" action="/process">
<!-- Thymeleaf 会自动添加CSRF令牌 -->
<input type="submit" value="提交"/>
</form>
在 JSP 中:
<form method="post" action="/process">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<input type="submit" value="提交"/>
</form>
- 在 REST API 中使用 CSRF
对于 REST API,通常有以下几种方式处理 CSRF:
使用 Cookie 和 Header 方式(推荐):
.csrf(csrf -> csrf .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) )
前端需要从 Cookie 中读取
XSRF-TOKEN
并在请求头中发送X-XSRF-TOKEN
对于无状态 API,可以考虑禁用 CSRF 并使用其他认证机制(如 JWT)
注意事项
• 默认情况下,CSRF 防护会应用到所有 HTTP 方法(除了 GET、HEAD、TRACE、OPTIONS)
• 确保登录表单也受到 CSRF 保护
• 在前后端分离应用中,需要正确配置 CSRF 令牌的传递方式
通过以上配置,你的 Spring Boot 应用就能得到有效的 CSRF 防护了。