针对 mybay.app 的全面安全、压力及并发性能审计。包含OWASP安全评估、API端点发现、认证测试、缓存策略分析、容量评估等7个维度。
相比上次审计(2026-06-28,76分),本次得分 +2 分 提升至 78/100。主要改进包含移除 X-Powered-By 信息泄露,但新增了约 30 个 API 端点,攻击面有所扩大。
目标应用架构概览
| 项目 | 值 |
|---|---|
| 目标 URL | https://mybay.app |
| 前端框架 | React 18 + Vite SPA (Tailwind CSS) |
| 后端 | Express.js (Node.js) |
| CDN | Cloudflare Anycast (4 IP: 104.21.27.208, 172.67.143.151 + IPv6) |
| HTTP 协议 | HTTP/1.1 + HTTP/2 + HTTP/3 (alt-svc h3) |
| SSL 证书 | Google Trust Services WE1, 2026-05-31 至 2026-08-29 |
| CAPTCHA | Cloudflare Turnstile (sitekey: 0x4AAAAAADm6nvbd1KvEC4h3) |
| JS Bundle | index-C1hw-qZr.js (上次: index-DGQcTGum.js) — 已更新 |
| 测试位置 | Cloudflare SEA PoP (西雅图) |
已解析子域名(15个):
对比 2026-06-28 审计结果的增量分析
X-Powered-By: Express 已移除 → 信息泄露修复/api/demo-proxy, /api/system/*, /api/public/instances/session-login 需关注所有关键安全头部均已配置,评分 18/20
| 安全头部 | 值 | 状态 |
|---|---|---|
| Content-Security-Policy | default-src 'self'; script-src 'self' https://challenges.cloudflare.com; style-src 'self' 'unsafe-inline'; connect-src 'self' ws: wss: https://challenges.cloudflare.com; font-src 'self' data:; img-src 'self' data: blob: https:; frame-src 'self' https://challenges.cloudflare.com | ✅ 良好 |
| Strict-Transport-Security | max-age=31536000; includeSubDomains | ✅ 优秀 |
| X-Frame-Options | DENY | ✅ 优秀 |
| X-Content-Type-Options | nosniff | ✅ 优秀 |
| Referrer-Policy | strict-origin-when-cross-origin | ✅ 良好 |
| Permissions-Policy | camera=(), microphone=(), geolocation=(), payment=() | ✅ 良好 |
| X-XSS-Protection | 0 | ✅ 正确(CSP 已覆盖) |
| X-Powered-By | 已移除(上次为 Express) | ✅ 修复 |
| NEL / report-to | Cloudflare NEL (604800s) | ✅ 良好 |
| CORS | 无 Access-Control-Allow-Origin 头部 | ✅ 正确(未开放跨域) |
从 JS Bundle 提取的 50 个 API 端点,按风险分类
管理/凭据/批量操作端点
认证/授权端点
公开/配置/功能端点
身份验证、限流、错误信息泄露评估 — 评分 16/20
所有受保护端点未经认证均返回 401 {"error":"Unauthorized"},包括:
/api/demo-proxy/token 返回 404 而非 401 — 与其他端点不一致,可能缺少统一认证中间件/api/public/instances/session-login — 公开 session 登录端点,需确保 IDOR 防护/api/system/test-llm, /api/system/test-channel, /api/system/test-skill — 测试端点,需确保仅在开发环境可用| 端点 | 限流阈值 | 结果 |
|---|---|---|
POST /api/auth/login | 10 次/窗口 | ✅ 第10次后返回 429 — 良好限流 |
POST /api/auth/register | — | ⚠️ 10 次内未触发 429(Turnstile 阻止了无效请求) |
POST /api/auth/forgot-password | 3 次/窗口 | ✅ 第3次后返回 429 — 良好 |
✅ 限流头部 x-ratelimit-limit, x-ratelimit-remaining, x-ratelimit-reset 正常返回
| 端点 | 错误消息 | 状态 |
|---|---|---|
| 登录(空字段) | "用户名或邮箱、以及密码均不能为空" | ⚠️ 泄露验证逻辑细节 |
| 注册(无验证码) | "尚未完成验证码校验,请重试。" | ✅ Turnstile 强制校验 |
| 忘记密码(有效) | "如果该邮箱已注册,密码重置链接已发送。" | ✅ 不泄露邮箱是否存在 |
按严重程度分类的安全发现
/api/demo-proxy/v1/chat/completions 是一个公开的 LLM 代理端点。如果未经认证即可调用,可能被滥用于免费使用 LLM 推理资源。/api/demo-proxy/token 返回 404 而非 401,可能存在配置遗漏。建议确认该端点的认证和限流机制。
/api/system/test-llm, /api/system/test-channel, /api/system/test-skill 三个测试端点在 JS Bundle 中可见。它们可能允许非管理员用户执行系统级测试操作。建议通过环境变量在生产环境中禁用这些路由。
登录端点返回"用户名或邮箱、以及密码均不能为空",暴露了字段级别的验证规则。建议使用通用消息如"登录信息无效"。
注册端点 10 次调用未触发 429。虽然 Turnstile 提供了第一层防护,但建议添加服务器端限流作为第二层防御。
/.well-known/security.txt 返回 SPA shell (200, 1074B HTML),无实际安全策略内容。建议部署安全策略文件便于安全研究人员联系。
CSP 中 style-src 'self' 'unsafe-inline' 在许多 SPA 框架中属常见配置。当部署更强的 nonce/hash 策略后可移除。
CSP 未包含 report-uri 或 report-to(NEL 已配置但 CSP report-to 未配置)。建议添加以监控 CSP 违规。
假设攻击者可能采取的攻击链
主要威胁: 新增的 demo-proxy、system/test-* 和 public/session-login 端点是新的攻击面。如果这些端点的认证/授权有缺陷,攻击者可利用它们绕过正常流程。
延迟基线、缓存策略、压缩效率、容量评估 — 并发得分 62/100
| 资源 | 平均 | 最小 | 最大 | 大小 |
|---|---|---|---|---|
| HTML 页面 | 113ms | 58ms | 204ms | 49.5KB |
| JS Bundle (Brotli) | — | — | — | 292KB (74%) |
| CSS (Brotli) | — | — | — | 25KB (88%) |
| Public API (auth/config) | 85ms | 51ms | 156ms | 69B |
| Auth API (me) | 74ms | 50ms | 110ms | 33B |
| 资源 | Cache-Control | CDN 状态 | 影响 |
|---|---|---|---|
| HTML | public, max-age=0 | DYNAMIC | 🔴 每次请求都回源 |
| JS Bundle | public, max-age=14400 (4h) | HIT / EXPIRED | 🟢 边缘缓存 |
| CSS | public, max-age=14400 (4h) | HIT / MISS | 🟢 边缘缓存 |
| API (所有) | no-store, no-cache | DYNAMIC | 🔴 全部回源 |
| 资源 | Raw | Brotli | 压缩率 |
|---|---|---|---|
| JS Bundle | 1,124KB | 292KB | 74% ✅ |
| CSS | 204KB | 25KB | 88% ✅ |
总计 4 个资源(1 JS + 1 CSS + 2 SVG)— 极简 SPA ✅
| 场景 | 最后用户等待时间 |
|---|---|
| 当前 (Express 单线程, ~10 req/s) | 🔴 1000 用户 → ~100 秒 |
| + 6 Worker PM2 集群 | 🟡 1000 用户 → ~17 秒 |
| + HTML 边缘缓存 (s-maxage) | 🟢 1000 用户 → ~10-20 秒 |
| + API 边缘缓存 + 集群 | 🟢 1000 用户 → ~3-5 秒 |
当前架构瓶颈(从最严重到最轻):
| 级别 | 瓶颈 | 影响 |
|---|---|---|
| 1️⃣ 🔴 | Express 单线程后端 | ~500-1500 req/s 上限 |
| 2️⃣ 🟡 | HTML 未缓存 (max-age=0) | 每次页面加载都回源 |
| 3️⃣ 🟡 | 全部 API 回源 | 无边缘卸载 |
| 4️⃣ 🟢 | Cloudflare CDN | 静态资源处理良好 |
| 5️⃣ 🟢 | Brotli 压缩 | 带宽效率高 |
安全 + 并发双维度评分
| 🛡️ 基础防御 | 18/20 | |
| 🔐 认证安全 | 16/20 | |
| 🔑 密钥保护 | 11/15 | |
| 🚪 攻击面 | 9/15 | |
| 📋 日志监控 | 8/10 | |
| 📝 透明度 | 7/10 | |
| 🧪 输入验证 | 8/10 |
| 🌐 CDN / Edge | 18/20 | |
| 📄 资源优化 | 17/20 | |
| ⚡ API 性能 | 12/20 | |
| 🖥️ 后端架构 | 8/20 | |
| 📊 弹性扩展 | 7/20 |
从最高优先级到最低优先级的修复建议
对 /api/demo-proxy/*, /api/system/test-*, /api/public/instances/session-login 进行安全审查,确保认证和授权正确,测试端点在生产环境禁用。
在 Cloudflare 设置 Cache Rule 缓存 HTML 页面(短 TTL 如 s-maxage=60),减少回源压力 80%+。
通过 PM2 或 Node.js Cluster 模块启动多进程,提升后端吞吐量 4-6 倍。
登录/注册/重置密码返回通用错误消息,避免泄露验证逻辑细节。
在注册端点添加服务器端限流(如 5 次/分钟/IP),作为 Turnstile 的第二层防御。
为 /api/auth/config, /api/system/features 等不可变公共端点设置 s-maxage 缓存,减少回源。
配置 /.well-known/security.txt 安全策略文件,并添加 CSP report-uri 监控违规。
| 维度 | 评分 | 关键结论 |
|---|---|---|
| 安全防护 | 78/100 🟢 B+ | 基础防御完善(HSTS/CSP/XFO),认证限流有效,X-Powered-By 已修复。新增 50 个端点需关注 demo-proxy 和 system/test 端点安全。 |
| 并发能力 | 62/100 🟡 | 前端优化优秀(极简 SPA, Brotli 74%, 4h 缓存)。瓶颈在后端:Express 单线程+无 HTML/API 缓存。PM2 集群 + Cloudflare Cache Rules 可提升到 85+。 |
| 攻击路径风险 | 🟢 低 | 主要攻击路径已被缓解(限流、Turnstile、JWT、401 授权)。主要威胁来自新增端点的未确认安全状态。 |
| 总容量评估 | ~1,000 CCU | 在 6 worker PM2 集群 + HTML 缓存后,可支撑 1000 并发用户,等待时间 ~10-20 秒。 |