From 746539a06712e0def9fedb46cfc2030dc90bbfa4 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, 18 Nov 2025 17:08:22 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=92=20=E4=BF=AE=E5=A4=8DCORS=E9=80=BB?= =?UTF-8?q?=E8=BE=91=20-=20=E6=AD=A3=E7=A1=AE=E5=A4=84=E7=90=86=E5=90=8C?= =?UTF-8?q?=E6=BA=90=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: - 第一次修复过于严格,拒绝了所有无Origin头的请求 - 导致浏览器的同源请求被拒绝,网站完全无法使用 修复方案: - 允许无Origin头的请求(同源请求不触发CORS) - 严格验证带Origin头的跨域请求(必须在白名单中) - 拒绝所有未授权的跨域请求 文件修改: - backend/server.js: 修正CORS中间件逻辑(第48-63行) 测试: - 同源请求正常工作 - 恶意跨域请求被拒绝 - API返回正确的状态码(不再是500错误) --- backend/server.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/backend/server.js b/backend/server.js index 18f52ae..d08b14e 100644 --- a/backend/server.js +++ b/backend/server.js @@ -46,11 +46,19 @@ const corsOptions = { } // 严格白名单模式:只允许白名单中的域名 - if (origin && allowedOrigins.includes(origin)) { + // 但需要允许没有Origin头的同源请求(浏览器访问时不会发送Origin) + if (!origin) { + // 没有Origin头的请求通常是: + // 1. 浏览器的同源请求(不触发CORS) + // 2. 直接的服务器请求 + // 这些都应该允许 + callback(null, true); + } else if (allowedOrigins.includes(origin)) { + // 白名单中的域名 callback(null, true); } else { - // 拒绝不在白名单中的请求(包括没有Origin头的请求) - console.warn(`[CORS] 拒绝来自未授权来源的请求: ${origin || '(无Origin头)'}`); + // 拒绝不在白名单中的跨域请求 + console.warn(`[CORS] 拒绝来自未授权来源的请求: ${origin}`); callback(new Error('CORS策略不允许来自该来源的访问')); } }