From e026c13fd3736e3b2a5266fe0d2567ba1ff09063 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 16:58:19 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=92=20=E4=BF=AE=E5=A4=8DCORS=E4=B8=A5?= =?UTF-8?q?=E9=87=8D=E5=AE=89=E5=85=A8=E6=BC=8F=E6=B4=9E=20&=20=E5=A2=9E?= =?UTF-8?q?=E5=BC=BANginx=E5=AE=89=E5=85=A8=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 关键修复 ### 1. 修复backend/server.js的CORS漏洞 ⚠️ CRITICAL **问题**: 原代码 `if (!origin || allowedOrigins.includes(origin))` 会允许所有没有Origin头的请求通过,导致恶意请求绕过CORS保护 **修复**: 严格白名单模式 ```javascript // 只允许白名单中的域名 if (origin && allowedOrigins.includes(origin)) { callback(null, true); } else { // 拒绝所有其他请求 callback(new Error('CORS策略不允许来自该来源的访问')); } ``` **影响**: - ✅ 阻止所有恶意域名的跨域访问 - ✅ 保护JWT token不被窃取 - ✅ 从63.6%预计提升到90%+安全评分 ### 2. 增强install.sh中的Nginx安全配置 在所有三个nginx配置函数中添加了完整的安全规则: - `configure_nginx_http_first()` - 初始HTTP配置 - `configure_nginx_http()` - 纯HTTP模式 - `configure_nginx_https()` - HTTPS模式 **新增安全配置**: ```nginx # 安全响应头 add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # HTTPS专用 # 隐藏Nginx版本 server_tokens off; # 禁止访问隐藏文件 (.git, .env等) location ~ /\. { deny all; return 404; } # 禁止访问敏感文件 location ~ \.(env|git|config|key|pem|crt|sql|bak|backup|old|log)$ { deny all; return 404; } ``` **防护效果**: - ✅ 阻止访问 /.env, /.git/config - ✅ 阻止访问备份文件 .bak, .sql - ✅ 防止点击劫持、XSS、MIME嗅探攻击 - ✅ 强制HTTPS(HTTPS环境下) - ✅ 隐藏服务器信息 ## 部署方法 在服务器上执行: ```bash cd /var/www/wanwanyun git pull origin master bash install.sh --repair # 重新生成Nginx配置 # 或者手动 pm2 restart wanwanyun-backend nginx -t && systemctl reload nginx ``` 然后运行安全测试验证: ```bash node security-test.js ``` 预期改进: - CORS测试: 只有cs.workyai.cn被允许 ✅ - 敏感文件: 全部返回404 ✅ - 安全响应头: 全部检测到 ✅ - 安全评分: 63.6% → 90%+ 🎯 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- backend/server.js | 7 +++--- install.sh | 64 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/backend/server.js b/backend/server.js index 66da5e8..18f52ae 100644 --- a/backend/server.js +++ b/backend/server.js @@ -45,11 +45,12 @@ const corsOptions = { } } - // 允许来自白名单中的域名 - if (!origin || allowedOrigins.includes(origin)) { + // 严格白名单模式:只允许白名单中的域名 + if (origin && allowedOrigins.includes(origin)) { callback(null, true); } else { - console.warn(`[CORS] 拒绝来自未授权来源的请求: ${origin}`); + // 拒绝不在白名单中的请求(包括没有Origin头的请求) + console.warn(`[CORS] 拒绝来自未授权来源的请求: ${origin || '(无Origin头)'}`); callback(new Error('CORS策略不允许来自该来源的访问')); } } diff --git a/install.sh b/install.sh index 31fdd03..ab243e4 100644 --- a/install.sh +++ b/install.sh @@ -2340,6 +2340,27 @@ server { # 文件上传大小限制(10GB) client_max_body_size 10G; + # ========== 安全响应头 ========== + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + add_header Referrer-Policy "no-referrer-when-downgrade" always; + + # 隐藏Nginx版本号 + server_tokens off; + + # ========== 禁止访问隐藏文件 ========== + location ~ /\\. { + deny all; + return 404; + } + + # ========== 禁止访问敏感文件 ========== + location ~ \\.(env|git|config|key|pem|crt|sql|bak|backup|old|log)$ { + deny all; + return 404; + } + # 前端静态文件 location / { root ${PROJECT_DIR}/frontend; @@ -2597,6 +2618,27 @@ server { # 文件上传大小限制(10GB) client_max_body_size 10G; + # ========== 安全响应头 ========== + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + add_header Referrer-Policy "no-referrer-when-downgrade" always; + + # 隐藏Nginx版本号 + server_tokens off; + + # ========== 禁止访问隐藏文件 ========== + location ~ /\\. { + deny all; + return 404; + } + + # ========== 禁止访问敏感文件 ========== + location ~ \\.(env|git|config|key|pem|crt|sql|bak|backup|old|log)$ { + deny all; + return 404; + } + # 前端静态文件 location / { root ${PROJECT_DIR}/frontend; @@ -2708,6 +2750,28 @@ server { # 文件上传大小限制(10GB) client_max_body_size 10G; + # ========== 安全响应头 ========== + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + add_header Referrer-Policy "no-referrer-when-downgrade" always; + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + + # 隐藏Nginx版本号 + server_tokens off; + + # ========== 禁止访问隐藏文件 ========== + location ~ /\\. { + deny all; + return 404; + } + + # ========== 禁止访问敏感文件 ========== + location ~ \\.(env|git|config|key|pem|crt|sql|bak|backup|old|log)$ { + deny all; + return 404; + } + # 前端静态文件 location / { root ${PROJECT_DIR}/frontend;