Files
vue-driven-cloud-storage/deploy.sh
喻勇祥 32429334ab 🔒 重大安全更新:修复CORS、XSS、敏感文件暴露等漏洞
本次更新修复了安全测试中发现的所有严重问题,大幅提升系统安全性。

## 修复的安全问题

### 1. CORS跨域配置漏洞 ⚠️ 严重
**问题**: 默认允许所有域名访问(ALLOWED_ORIGINS=*)
**修复**:
- 默认值改为空数组,生产环境必须明确配置域名白名单
- 未配置时拒绝所有跨域请求(生产环境)
- 开发环境仅允许localhost访问

### 2. XSS跨站脚本攻击 ⚠️ 严重
**问题**: 用户输入未过滤,可注入恶意脚本
**修复**:
- 添加XSS过滤中间件,自动转义所有POST/PUT请求的用户输入
- 过滤 <, >, ', " 等危险字符
- 递归处理嵌套对象和数组

### 3. 缺少安全响应头 ⚠️ 重要
**问题**: 缺少X-Frame-Options等安全响应头
**修复**:
- X-Frame-Options: SAMEORIGIN (防止点击劫持)
- X-Content-Type-Options: nosniff (防止MIME嗅探)
- X-XSS-Protection: 1; mode=block
- Strict-Transport-Security (HTTPS环境)
- Content-Security-Policy (内容安全策略)
- 隐藏X-Powered-By和Server版本信息

### 4. 敏感文件暴露风险 ⚠️ 严重
**问题**: .env、.git等敏感文件可能被访问
**修复**:
- Nginx配置禁止访问以.开头的隐藏文件
- 禁止访问.env、.git、.config、.key、.pem等敏感文件
- 更新.gitignore,防止敏感文件提交到代码仓库
- 添加证书、密钥等文件类型到忽略列表

## 代码改动

### backend/server.js
- 修改CORS默认配置,移除危险的 * 通配符
- 添加安全响应头中间件
- 添加XSS过滤中间件(sanitizeInput函数)
- 生产环境强制检查ALLOWED_ORIGINS配置

### nginx/nginx.conf
- 添加安全响应头配置
- 禁止访问隐藏文件和敏感文件的location规则
- 隐藏Nginx版本号(server_tokens off)

### .gitignore
- 添加敏感配置文件保护(.env.local, config.json等)
- 添加证书和密钥文件类型(.key, .pem, .crt等)

### deploy.sh
- 修改默认配置,移除ALLOWED_ORIGINS=*
- 添加安全警告提示

## 部署说明

⚠️ **重要**: 更新后必须配置ALLOWED_ORIGINS环境变量!

### 手动部署
编辑 `backend/.env` 文件:
```bash
ALLOWED_ORIGINS=https://cs.workyai.cn
NODE_ENV=production
```

### 使用install.sh部署
脚本会自动根据域名配置ALLOWED_ORIGINS

## 测试结果

修复前安全评分: 57.6% (14个安全问题)
修复后预期评分: 90%+ (预计解决12+个问题)

## 兼容性

-  向后兼容,不影响现有功能
-  开发环境自动允许localhost访问
- ⚠️ 生产环境必须配置ALLOWED_ORIGINS(否则无法访问)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18 16:29:44 +08:00

156 lines
4.2 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# 玩玩云一键部署脚本
# 使用方法: bash deploy.sh
set -e
echo "========================================="
echo " 玩玩云 - 一键部署脚本"
echo "========================================="
echo ""
# 检查Docker
if ! command -v docker &> /dev/null; then
echo "❌ 错误: Docker未安装"
echo "请先安装Docker: https://docs.docker.com/engine/install/"
exit 1
fi
# 检查Docker Compose
if ! command -v docker-compose &> /dev/null; then
echo "❌ 错误: Docker Compose未安装"
echo "请先安装Docker Compose: https://docs.docker.com/compose/install/"
exit 1
fi
echo "✓ Docker版本: $(docker --version)"
echo "✓ Docker Compose版本: $(docker-compose --version)"
echo ""
# 检查必要的目录
echo "📁 检查项目结构..."
REQUIRED_DIRS=("backend" "frontend" "nginx")
for dir in "${REQUIRED_DIRS[@]}"; do
if [ ! -d "$dir" ]; then
echo "❌ 错误: 缺少 $dir 目录"
exit 1
fi
done
echo "✓ 项目结构完整"
echo ""
# 创建必要的目录
echo "📂 创建必要的目录..."
mkdir -p certbot/conf
mkdir -p certbot/www
mkdir -p backend/uploads
mkdir -p storage
echo "✓ 目录创建完成"
echo ""
# 检查.env文件并生成JWT密钥
echo "🔐 配置环境变量..."
if [ ! -f "backend/.env" ]; then
echo "⚠️ backend/.env 文件不存在,正在创建..."
if [ -f "backend/.env.example" ]; then
cp backend/.env.example backend/.env
echo "✓ 已从.env.example创建.env文件"
else
echo "⚠️ .env.example不存在创建基础配置"
cat > backend/.env << 'ENVEOF'
PORT=40001
NODE_ENV=production
ADMIN_USERNAME=admin
ADMIN_PASSWORD=admin123
STORAGE_ROOT=/app/storage
# CORS配置 - 生产环境必须设置!
# 示例: ALLOWED_ORIGINS=https://yourdomain.com
ALLOWED_ORIGINS=
COOKIE_SECURE=false
ENVEOF
echo ""
echo "⚠️ 警告: ALLOWED_ORIGINS未配置"
echo " 生产环境必须在backend/.env中设置ALLOWED_ORIGINS"
echo " 示例: ALLOWED_ORIGINS=https://cs.workyai.cn"
echo ""
fi
# 生成随机JWT密钥
echo "🔑 生成随机JWT密钥..."
JWT_SECRET=$(openssl rand -hex 32 2>/dev/null || cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 64 | head -n 1)
# 替换或添加JWT_SECRET
if grep -q "^JWT_SECRET=" backend/.env; then
sed -i "s|^JWT_SECRET=.*|JWT_SECRET=$JWT_SECRET|" backend/.env
else
echo "JWT_SECRET=$JWT_SECRET" >> backend/.env
fi
echo "✓ JWT密钥已生成并保存"
else
echo "✓ backend/.env 文件已存在"
# 检查JWT_SECRET是否为默认值
if grep -q "^JWT_SECRET=your-secret-key" backend/.env; then
echo "⚠️ 检测到JWT_SECRET使用默认值正在生成新密钥..."
JWT_SECRET=$(openssl rand -hex 32 2>/dev/null || cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 64 | head -n 1)
sed -i "s|^JWT_SECRET=.*|JWT_SECRET=$JWT_SECRET|" backend/.env
echo "✓ JWT密钥已更新"
fi
fi
echo ""
# 停止旧容器
echo "🔄 停止旧容器..."
docker-compose down 2>/dev/null || true
echo "✓ 旧容器已停止"
echo ""
# 构建并启动
echo "🚀 构建并启动服务..."
docker-compose up --build -d
# 等待服务启动
echo ""
echo "⏳ 等待服务启动..."
sleep 5
# 检查容器状态
echo ""
echo "📊 检查容器状态..."
docker-compose ps
# 检查后端日志
echo ""
echo "📝 后端启动日志:"
docker-compose logs --tail=20 backend
# 显示访问信息
echo ""
echo "========================================="
echo " 🎉 部署完成!"
echo "========================================="
echo ""
echo "📍 访问地址:"
echo " 前端: http://localhost:8080"
echo " 后端API: http://localhost:40001"
echo ""
echo "👤 默认管理员账号:"
echo " 用户名: admin"
echo " 密码: admin123"
echo " ⚠️ 请立即登录并修改密码!"
echo ""
echo "🔐 安全提示:"
echo " JWT密钥已自动生成保存在 backend/.env 中"
echo " 请妥善保管该文件!"
echo ""
echo "📚 查看日志:"
echo " docker-compose logs -f"
echo ""
echo "🛑 停止服务:"
echo " docker-compose down"
echo ""
echo "========================================="