From ee555af1a52999ff1bbb9b65e1c794909955dc70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=BB=E5=8B=87=E7=A5=A5?= <237899745@qq.com> Date: Tue, 11 Nov 2025 13:33:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=89=E5=85=A8:=20=E4=BC=98=E5=8C=96CORS?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=EF=BC=8C=E6=94=AF=E6=8C=81=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E6=8E=A7=E5=88=B6=E5=85=81=E8=AE=B8=E7=9A=84?= =?UTF-8?q?=E6=9D=A5=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题描述: - CORS配置使用origin: true允许所有来源 - 无法限制跨域访问,存在CSRF风险 - 生产环境应该只允许特定域名访问 修复内容: 1. 从环境变量ALLOWED_ORIGINS读取允许的来源列表 2. 支持多个域名配置(逗号分隔) 3. 实现origin验证回调函数 4. 默认允许所有(*),但在生产环境会发出警告 5. 记录并拒绝未授权来源的请求 配置示例: - 开发环境: ALLOWED_ORIGINS=* - 生产环境: ALLOWED_ORIGINS=https://yourdomain.com,https://www.yourdomain.com 影响范围: 跨域请求控制 测试建议: - 配置ALLOWED_ORIGINS后验证只有指定域名可以访问 - 生产环境使用*时应该看到警告日志 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- backend/server.js | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/backend/server.js b/backend/server.js index 8826da2..446014a 100644 --- a/backend/server.js +++ b/backend/server.js @@ -18,8 +18,36 @@ const { generateToken, authMiddleware, adminMiddleware } = require('./auth'); const app = express(); const PORT = process.env.PORT || 40001; + +// 配置CORS +const allowedOrigins = process.env.ALLOWED_ORIGINS + ? process.env.ALLOWED_ORIGINS.split(',').map(origin => origin.trim()) + : ['*']; + +const corsOptions = { + credentials: true, + origin: (origin, callback) => { + // 允许所有来源(仅限开发环境) + if (allowedOrigins.includes('*')) { + if (process.env.NODE_ENV === 'production') { + console.warn('⚠️ 警告: 生产环境建议配置具体的ALLOWED_ORIGINS,而不是使用 *'); + } + callback(null, true); + return; + } + + // 允许来自配置列表中的域名 + if (!origin || allowedOrigins.includes(origin)) { + callback(null, true); + } else { + console.warn(`[CORS] 拒绝来自未授权来源的请求: ${origin}`); + callback(new Error('CORS策略不允许来自该来源的访问')); + } + } +}; + // 中间件 -app.use(cors({ credentials: true, origin: true })); +app.use(cors(corsOptions)); app.use(express.json()); app.use(cookieParser());