用途:在审查本项目(Next.js App Router、Payload CMS(SQLite/Turso、Vercel Blob)、Remark/Shiki Markdown、Vercel 托管、Sentry、Mixpanel)的代码变更时,核对安全与隐私影响。框架为按 OWASP Top 10 映射到该技术栈的规则清单。
主要能力与要点: 密钥与环境变量:禁止提交明文密钥(Payload secret、带 token 的 Sentry DSN、Vercel Blob token、Turso token、测试用户密码);process.env.* 仅在白名单的环境访问文件中读取;NEXT_PUBLIC_* 仅用于有意暴露给浏览器的值;.env.local 需 gitignore,示例只放 .env.example。 输入校验:route.ts 处理器在交给 Payload 或 fetch 前校验并强制转换输入;params / searchParams 视为不可信;仓储 where 子句接收已净化值(slug 无数组强制转换绕过);返回值先经 payload-types.ts 中的 Zod schema 解析再进组件。 访问控制:每个 Payload 集合/全局有明确 access 配置;未请求草稿时用 _status: { equals: "published" } 过滤;不削弱 users 集合的 auth lock 设置;新增 route.ts 变更端点(如 /posts/caches 重新验证路由)防未认证滥用。 隐私与暴露:草稿、预览、仅管理员、未发布内容不得经公开路由、元数据、JSON-LD、sitemap、robots、图片路由泄露;公开媒体 URL 只暴露有意公开的资产,不泄露私有存储 token 或内部标识;Sentry 与 Mixpanel 变更不采集多余 PII、密钥、草稿内容或 CMS 私有字段;客户端环境变量、分析事件属性、错误上下文须是有意公开的。 Markdown 渲染 XSS:注意 markdown.ts 中 remarkParse 的 allowDangerousProtocol: true;新 HAST 元素映射不得把用户可控 URL 传入 dangerouslySetInnerHTML 或未净化属性;自定义指令(当前 webembed)只输出 React 会编码的属性;渲染器 defaultComponents 中新增组件须安全编码不可信子节点;不得绕过 rehypeReact。 SSRF 与嵌入抓取:getWebEmbedMetadata(对 CMS 内容中的任意 URL 发起 fetch)不得让内网 URL 进入生产;URL 用户可控时不得给 Image 组件用 unoptimized;流入 fetch 的 CMS 作者可控 URL 需经允许列表或主机名检查;next.config.ts 的 images.remotePatterns 新增项须严格限定。 认证与会话:不放松 users 集合的 auth lockout(lockTime、maxLoginAttempts);实时预览/草稿状态只能经 Payload 认证路径到达,不能靠查询字符串绕过;新增标识/上下文时注意 Sentry sendDefaultPii: true 的暴露。 供应链:新增 npm 依赖需按开发指南的变更管理说明理由;依赖应较流行、有维护、平台无关;更新 lockfile,检查传递新增项是否有已知漏洞版本;新依赖的 postinstall / prepare 脚本不得执行意外代码。
使用方式:作为代码审查时的逐项检查清单,按变更涉及的领域引用对应文档(secret-handling.md、input-validation.md、access-control.md、privacy-and-exposure.md、xss-in-markdown.md、ssrf-and-embeds.md、auth-and-session.md、supply-chain.md)。
限制:资料未提供该技能的安装命令、适用平台范围、是否收费及具体执行步骤。