GitHub_Trending/ba/basic CSRF攻击防御:令牌验证与同源检测
跨站请求伪造(CSRF,Cross-Site Request Forgery)是一种常见的Web安全威胁,攻击者通过诱导用户在已认证的情况下执行非预期操作。本文将结合GitHub_Trending/ba/basic项目的实际实现,介绍如何通过令牌验证与同源检测构建有效的CSRF防御体系。
一、CSRF防御现状分析
在现代Web应用中,CSRF防御通常依赖三大机制:令牌验证、同源检测和SameSite Cookie策略。通过对项目源码的全局扫描(使用search_files工具搜索csrf|token|XSRF关键字),发现当前项目主要通过以下文件实现安全防护:
- 请求拦截器:src/api/index.ts 负责请求头处理
- 代理配置:vite.config.ts 控制跨域请求策略
- 用户认证:src/store/modules/user.ts 管理登录状态与令牌
二、令牌验证机制实现
项目采用请求头令牌方案,在每个API请求中附加认证令牌。核心实现位于src/api/index.ts的请求拦截器:
api.interceptors.request.use(
(request) => {
const userStore = useUserStore()
if (request.headers && userStore.isLogin) {
request.headers.Token = userStore.token // 附加认证令牌
}
return request
},
)
令牌生命周期管理
- 令牌生成:用户登录时由后端签发,通过src/api/modules/user.ts的
login接口获取 - 存储机制:使用Pinia状态管理存储令牌,源码参见src/store/modules/user.ts
- 自动续期:通过src/api/index.ts的响应拦截器实现令牌过期自动重试
安全增强建议
当前实现使用Token请求头传递认证信息,建议增加CSRF专用令牌字段:
// 建议修改:添加CSRF令牌
if (request.headers && userStore.isLogin) {
request.headers.Token = userStore.token;
request.headers['X-CSRF-Token'] = userStore.csrfToken; // 添加专用CSRF令牌
}
三、同源检测策略
项目通过Vite的开发服务器配置实现跨域请求控制,vite.config.ts中的代理设置:
server: {
proxy: {
'/proxy': {
target: env.VITE_APP_API_BASEURL,
changeOrigin: command === 'serve' && env.VITE_OPEN_PROXY === 'true', // 跨域时修改Origin
rewrite: path => path.replace(/\/proxy/, ''),
},
},
}
关键配置解析
- changeOrigin: true:当启用代理时,会将请求的
Origin头修改为目标服务器域名 - 严格路径匹配:仅对
/proxy前缀的请求进行代理,限制跨域范围 - 环境隔离:通过
VITE_OPEN_PROXY环境变量控制生产/开发环境的跨域策略
前端同源检测实现
在src/utils/ua.ts中可添加Origin验证工具函数:
// 建议添加:验证请求来源合法性
export function validateOrigin(origin: string): boolean {
const allowedOrigins = ['https://yourdomain.com', 'https://admin.yourdomain.com'];
return allowedOrigins.includes(origin) || origin.endsWith('.yourdomain.com');
}
四、可视化安全架构
图:用户认证流程与令牌分发示意图,图片来源src/assets/images/login-banner.png
CSRF防御流程图
五、生产环境安全加固
推荐配置清单
-
Cookie安全属性:在src/utils/cookie.ts中设置
// 建议添加 document.cookie = `csrfToken=${token}; SameSite=Strict; Secure; HttpOnly`; -
请求来源验证:在src/api/index.ts添加Origin检查
const allowedOrigins = ['https://yourdomain.com']; if (!allowedOrigins.includes(request.headers.origin)) { return Promise.reject(new Error('非法请求来源')); } -
安全审计日志:通过src/utils/log.ts记录可疑请求
六、参考资源
- 官方文档:README.md 中的"安全最佳实践"章节
- 认证模块:src/components/AccountForm/LoginForm.vue
- 状态管理:src/store/index.ts 中的安全相关配置
- 图标资源:系统安全图标 src/assets/icons/403.svg
通过以上多层防御机制,GitHub_Trending/ba/basic项目能够有效抵御CSRF攻击。建议定期使用src/utils/security.ts中的安全检测工具进行自检,确保防御措施持续有效。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



