2026-04-03 打卡
1. 今天学了什么 / 做了哪些具体操作
全量代码审计
喵喵对 AI Text Humanizer 项目做了完整代码审查,覆盖所有 API 路由、认证逻辑、支付流程、数据库操作。发现 12 个问题,全部修复并部署上线。
安全修复(4 项)
- Admin API 硬编码密码:删除
token === "xdx54321:mm5822655"硬编码比对,仅保留 env varLOG_ADMIN_KEY校验 - 积分扣除静默失败:
deductCredits().catch(() => {})→ await + 打印[CREDIT_ERROR]日志,方便事后补扣 - 积分余额泄露:错误信息从
(${credits} left, need ${needed})改为通用提示 - Checkout 降级保护:新增
PLAN_HIERARCHY比较,已购 Pro 的用户无法重复买 Basic
功能补全(5 项)
- subscription_updated webhook:处理用户升降级,active/paid → 更新 plan,expired/cancelled → 降为 free
- Success 页面改版:从静态文字改为调用
/api/user-plan显示当前套餐、可用字数、账号信息 - error.tsx:500 错误页,带重试按钮和返回首页链接
- not-found.tsx:404 页面,带返回首页链接
- robots.txt + sitemap.xml:SEO 基础,提交给搜索引擎
安全加固(3 项)
- public/_headers:5 个安全响应头(X-Frame-Options: DENY、X-Content-Type-Options: nosniff、Referrer-Policy、Permissions-Policy、X-XSS-Protection)
- CORS 注释:补充说明 CORS 不是认证屏障,JWT 才是
- Turnstile 注释:说明已登录用户跳过 Turnstile 的原因(auth check 在前面)
自动化测试
- Admin 旧密码 → 401 ✅
- Admin 新密码 → 200 ✅
- robots.txt → 正常 ✅
- sitemap.xml → 3 个页面 ✅
- 安全头 → 5 个全部返回 ✅
- 404 页面 → 404 ✅
- 未登录 humanize → 401 ✅
- 未登录 checkout → 401 ✅
- Webhook 无签名 → 401 ✅
2. 解决了什么问题 / 有什么新认识 / 哪些地方需要改进
解决的问题:
- 硬编码密码一旦代码泄露整个后台就裸了
- 积分扣费失败用户白嫖但完全无感知,无法事后追回
- 订阅升降级没有处理,用户升级后 plan 不会自动更新
- 缺少基础 SEO 和错误页面,用户体验不完整
新认识:
- CF Pages 的
_headers文件可以方便地加安全头,不需要 middleware - Next.js 的
not-found.tsx不能用"use client"+ framer-motion(静态预渲染会崩),要保持服务端组件 sitemap.ts是 Next.js 内置约定,不需要额外配置就能生成 sitemap.xml- 代码审计要从攻击者视角看——如果我是恶意用户,能怎么利用这个系统
需要改进:
- 安全头里没加 CSP(Content-Security-Policy),因为 Next.js 大量使用 inline scripts/styles,加 CSP 需要配合 nonce,复杂度较高,后续再处理
- 历史数据存储策略还是 TODO 状态,用户量上来后需要清理机制
3. 有收获、进步、新知识的学习、成果都算好事
- 完整做了一次安全审计 → 从发现问题到修复到测试到部署全流程闭环
- 学会了用 curl 做系统性的 API 测试
- 加深了对"深度防御"的理解:CORS + JWT + webhook 签名 + 降级保护,每一层都有自己的职责
4. 接下来要学什么 / 做什么(可执行的规划)
- [ ] LemonSqueezy 切 Live Mode
- [ ] 确认产品定价(前端 vs LS Dashboard 对齐)
- [ ] Product Hunt 发布准备(文案、截图、tagline)
- [ ] 接入 Sentry 监控