6.3 KiB
6.3 KiB
安全改进总结
日期: 2026-05-05
改进范围: Phase 1 (安全短板) + Phase 2 (部分工程基础)
已完成的改进
Phase 1: 安全短板修复 ✅
1. 修复硬编码管理员密码 (create-admin.ts)
风险等级: 🟢 低风险
改动:
- 从环境变量
ADMIN_EMAIL/ADMIN_PASSWORD读取凭据 - 如未设置则自动生成安全随机密码
- 不再将密码打印到 console(仅在自动生成时打印一次)
向后兼容: ✅ 是(未设置环境变量时使用默认邮箱 + 随机密码)
测试建议:
# 测试 1: 使用环境变量
ADMIN_EMAIL=admin@test.com ADMIN_PASSWORD=SecurePass123! node create-admin.ts
# 测试 2: 自动生成密码
node create-admin.ts
2. 修复 trustHost 安全配置
风险等级: 🟡 中等风险
改动:
app/(auth)/auth.config.ts:trustHost改为条件启用- Vercel 环境 (
VERCEL=1) 自动开启 - 其他环境需显式设置
AUTH_TRUST_HOST=true
- Vercel 环境 (
app/(auth)/auth.ts: 移除重复的trustHost: true覆盖
潜在影响:
- ⚠️ 非 Vercel 部署且未设置
AUTH_TRUST_HOST=true时,NextAuth 会严格校验 Host 头 - 如果反向代理未正确传递 Host 头,可能导致登录失败
测试建议:
# 开发环境测试登录流程
pnpm dev
# 访问 http://localhost:3000/login 测试登录
# 生产环境部署前检查
echo $VERCEL # Vercel 环境应为 "1"
echo $AUTH_TRUST_HOST # 非 Vercel 环境应设为 "true"
3. 添加 HTTP 安全头
风险等级: 🟢 低风险
改动: next.config.ts 新增 headers() 函数
X-Content-Type-Options: nosniffX-Frame-Options: SAMEORIGINReferrer-Policy: strict-origin-when-cross-originPermissions-Policy: camera=(), microphone=(), geolocation=()Content-Security-Policy(开发环境允许 unsafe-eval,生产环境更严格)
潜在影响:
- CSP 可能阻止某些第三方脚本(如未在
connect-src白名单中的 API) - 如有嵌入需求(iframe),需调整
X-Frame-Options
测试建议:
# 启动后检查响应头
curl -I http://localhost:3000 | grep -E "X-Content-Type|X-Frame|CSP"
4. 创建 middleware.ts 接入 proxy.ts
风险等级: 🔴 高风险 - 需重点测试
改动: 新建 /middleware.ts
export { proxy as middleware, config } from "./proxy";
影响:
- ✅ 限流功能首次生效(之前 proxy.ts 存在但未被 Next.js 加载)
- ✅ IP 黑名单检查生效
- ✅ 可疑请求检测生效
- ⚠️ 所有 API 路由现在都会经过中间件检查
潜在问题:
- 限流过严: 如果用户正常使用触发限流(如画布自动保存频繁),会返回 429
- 误判可疑请求:
lib/security/request-monitor.ts的规则可能误报 - 性能影响: 每个请求都要经过 IP 检查、限流检查、可疑模式匹配
测试建议:
# 1. 检查中间件是否加载
pnpm build
cat .next/server/middleware-manifest.json # 应有内容,不再为空
# 2. 测试限流
# 快速刷新页面 100 次,应触发 429
# 3. 测试正常流程
# 登录、创建画布、上传图片、聊天 - 确保都正常工作
# 4. 检查日志
# 查看是否有 "[Security] Rate limit exceeded" 等日志
5. 补充 .env.example
风险等级: 🟢 无风险(纯文档)
新增条目:
AUTH_URL/NEXTAUTH_URLAUTH_TRUST_HOSTGOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRETADMIN_EMAIL/ADMIN_PASSWORDFAL_KEY
Phase 2: 工程基础改进 ✅
6. 建立结构化日志系统
风险等级: 🟢 低风险
新增文件: lib/logger.ts
- 提供
log.info(),log.error(),log.warn(),log.debug() - 支持模块化日志:
createLogger("ModuleName") - 开发环境可读格式,生产环境 JSON 格式
- 通过
LOG_LEVEL环境变量控制输出级别
使用示例:
import { createLogger } from "@/lib/logger";
const log = createLogger("MyService");
log.error("Operation failed", error, { userId: "123" });
7. 修复 service 层错误吞没
风险等级: 🟡 中等风险
改动:
services/canvas/index.ts: 添加 logger 导入和辅助函数(未全部迁移)
潜在问题:
handleError(err, context, fallbackMessage)参数顺序与之前不同
8. 更新安全文档
风险等级: 🟢 无风险(纯文档)
改动: lib/security/IMPLEMENTATION_GUIDE.md 更新至实际状态
未完成的任务
Phase 2 剩余
- ❌ 为缺少验证的路由补充 Zod schema (enhance, rmbg, canvas/text-edit 等)
- ❌ 迁移剩余 service 文件的错误处理(canvas 有 31 个 catch 块未完全迁移)
Phase 3
- ❌ 补充核心单元测试
- ❌ 添加 Dockerfile 支持
回滚方案
如果部署后出现问题,可以快速回滚:
回滚 middleware(最高优先级)
# 删除 middleware.ts,限流和安全检查将停止工作
rm middleware.ts
pnpm build
回滚 trustHost
# 在 auth.config.ts 中改回
trustHost: true,
回滚其他改动
git diff HEAD # 查看所有改动
git checkout HEAD -- <file> # 回滚单个文件
部署前检查清单
- 在开发环境运行
pnpm dev,确保无编译错误 - 测试登录/登出流程
- 测试聊天、画布、图片生成等核心功能
- 快速刷新页面,确认限流触发(应看到 429 错误)
- 检查
.next/server/middleware-manifest.json不为空 - 设置生产环境变量:
AUTH_TRUST_HOST=true(如非 Vercel)LOG_LEVEL=warn(生产环境)ADMIN_PASSWORD=<secure-password>(如需创建管理员)
- 运行
pnpm build确保生产构建成功
监控建议
部署后前 24 小时重点监控:
- 错误率: 是否有大量 429 (限流) 或 403 (IP 黑名单) 错误
- 登录成功率: trustHost 改动可能影响登录
- 日志输出: 检查是否有 "[Security]" 前缀的警告
- 性能: 中间件增加的延迟(应 <10ms)
联系与支持
如遇问题,优先检查:
.next/server/middleware-manifest.json是否正确生成- 浏览器控制台是否有 CSP 违规警告
- 服务器日志中是否有 "[Security]" 相关错误