MST

星途 面试题库

面试题:Java Spring Boot中如何应对CSRF攻击并优化安全性配置

详细描述在Java Spring Boot应用中,CSRF攻击的原理及危害。阐述如何通过Spring Security进行CSRF防护配置,同时讨论如何在保护应用免受CSRF攻击的同时,优化安全性配置以避免影响性能和用户体验,包括考虑不同的请求场景(如AJAX请求)以及与前端框架的兼容性。
29.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

CSRF攻击原理

  1. 原理
    • CSRF(Cross - Site Request Forgery,跨站请求伪造)攻击利用用户已登录的身份,在用户不知情的情况下,诱骗用户访问恶意网站,该恶意网站会向用户已登录的目标应用发送请求。因为用户已经在目标应用登录,目标应用的服务器会认为这些请求是合法用户发起的,从而执行相应操作。
    • 例如,用户在银行网站登录后,未退出账号,此时访问了一个恶意网站,恶意网站构造一个向银行网站转账的请求,银行网站由于用户已登录且持有合法的会话凭证(如Cookie),会执行转账操作,而用户却浑然不知。

CSRF攻击危害

  1. 数据篡改:攻击者可以伪造请求修改用户在目标应用中的数据,如修改用户个人信息、订单信息等。
  2. 执行敏感操作:像进行资金转账、删除重要数据、执行关键业务操作等,导致用户经济损失或业务受到破坏。

通过Spring Security进行CSRF防护配置

  1. 引入依赖: 在pom.xml文件中添加Spring Security依赖,如果使用Maven,示例如下:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
  1. 配置CSRF防护: 创建一个配置类,继承WebSecurityConfigurerAdapter(Spring Boot 2.7及以下版本)或实现SecurityFilterChain(Spring Boot 3.0及以上版本)。以Spring Boot 3.0为例:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.CsrfConfigurer;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
          .csrf(CsrfConfigurer::disable); // 暂时禁用CSRF,实际生产应启用并合理配置
          // 或者启用CSRF
          // http.csrf(csrf -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()));
            return http.build();
    }
}

启用CSRF时,可以使用CookieCsrfTokenRepository来存储CSRF令牌,withHttpOnlyFalse()表示允许JavaScript访问CSRF令牌,适用于一些前端框架需要通过JavaScript获取令牌的场景。

优化安全性配置避免影响性能和用户体验

  1. 不同请求场景 - AJAX请求
    • 设置CSRF令牌:对于AJAX请求,前端需要在请求头中携带CSRF令牌。Spring Security默认将CSRF令牌存储在名为X - CSRF - Token的请求头中。前端可以从Cookie(如果配置为withHttpOnlyFalse())或其他存储方式获取令牌,并添加到AJAX请求头中。
    • 示例代码(以JavaScript的fetch为例)
// 假设通过某种方式获取到了CSRF令牌
const csrfToken = getCsrfToken(); 
fetch('/your - api - endpoint', {
    method: 'POST',
    headers: {
        'Content - Type': 'application/json',
        'X - CSRF - Token': csrfToken
    },
    body: JSON.stringify({ data: 'your data' })
});
  1. 与前端框架的兼容性
    • Angular:Angular提供了内置的CSRF防护机制,可以与Spring Security集成。在src/environments/environment.tssrc/environments/environment.prod.ts文件中配置CSRF令牌的头名和存储位置。
    • Vue.js:在Vue应用中,可以在axios(常用的HTTP库)的拦截器中添加CSRF令牌。例如:
import axios from 'axios';

const csrfToken = getCsrfToken(); 
axios.interceptors.request.use(config => {
    config.headers['X - CSRF - Token'] = csrfToken;
    return config;
}, error => {
    return Promise.reject(error);
});
  1. 性能优化
    • 合理设置CSRF令牌的有效期:过长的有效期可能增加被攻击风险,过短则可能导致用户频繁重新登录影响体验。可以根据应用的实际情况,如业务操作频率、安全敏感度等设置合适的有效期。
    • 缓存策略:对于一些不涉及CSRF敏感操作的静态资源,可以设置合理的缓存策略,减少服务器压力,提高响应速度。同时确保缓存设置不会影响CSRF防护机制的正常运行。