面试题答案
一键面试CSRF攻击原理
- 原理:
- CSRF(Cross - Site Request Forgery,跨站请求伪造)攻击利用用户已登录的身份,在用户不知情的情况下,诱骗用户访问恶意网站,该恶意网站会向用户已登录的目标应用发送请求。因为用户已经在目标应用登录,目标应用的服务器会认为这些请求是合法用户发起的,从而执行相应操作。
- 例如,用户在银行网站登录后,未退出账号,此时访问了一个恶意网站,恶意网站构造一个向银行网站转账的请求,银行网站由于用户已登录且持有合法的会话凭证(如Cookie),会执行转账操作,而用户却浑然不知。
CSRF攻击危害
- 数据篡改:攻击者可以伪造请求修改用户在目标应用中的数据,如修改用户个人信息、订单信息等。
- 执行敏感操作:像进行资金转账、删除重要数据、执行关键业务操作等,导致用户经济损失或业务受到破坏。
通过Spring Security进行CSRF防护配置
- 引入依赖:
在
pom.xml
文件中添加Spring Security依赖,如果使用Maven,示例如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
- 配置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获取令牌的场景。
优化安全性配置避免影响性能和用户体验
- 不同请求场景 - AJAX请求:
- 设置CSRF令牌:对于AJAX请求,前端需要在请求头中携带CSRF令牌。Spring Security默认将CSRF令牌存储在名为
X - CSRF - Token
的请求头中。前端可以从Cookie(如果配置为withHttpOnlyFalse()
)或其他存储方式获取令牌,并添加到AJAX请求头中。 - 示例代码(以JavaScript的
fetch
为例):
- 设置CSRF令牌:对于AJAX请求,前端需要在请求头中携带CSRF令牌。Spring Security默认将CSRF令牌存储在名为
// 假设通过某种方式获取到了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' })
});
- 与前端框架的兼容性:
- Angular:Angular提供了内置的CSRF防护机制,可以与Spring Security集成。在
src/environments/environment.ts
和src/environments/environment.prod.ts
文件中配置CSRF令牌的头名和存储位置。 - Vue.js:在Vue应用中,可以在
axios
(常用的HTTP库)的拦截器中添加CSRF令牌。例如:
- Angular:Angular提供了内置的CSRF防护机制,可以与Spring Security集成。在
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);
});
- 性能优化:
- 合理设置CSRF令牌的有效期:过长的有效期可能增加被攻击风险,过短则可能导致用户频繁重新登录影响体验。可以根据应用的实际情况,如业务操作频率、安全敏感度等设置合适的有效期。
- 缓存策略:对于一些不涉及CSRF敏感操作的静态资源,可以设置合理的缓存策略,减少服务器压力,提高响应速度。同时确保缓存设置不会影响CSRF防护机制的正常运行。