// docs / security guides / claude code checklist
Claude Code 安全检查清单:26 项
Claude Code(Anthropic 的 CLI 代理)通过斜杠命令生成整个代码库,管理多文件重构,并通过 bash 读取/writes 文件。此清单针对 Claude Code 的特定风险:没有默认安全策略、很少添加速率限制、<code>.claude/CLAUDE.md</code> 作为安全防护文件,以及提交 <code>.env</code> 或缓存令牌的风险。涉及机密、数据库、身份验证、标头、部署和 Claude Code 特定陷阱的 26 个项目。
PRE = 预部署(审核您的源)。 DEPLOY = 在部署时。 POST = 部署后验证。相关项目参考FixVibe 检查category.check-id 表单中的ID。
秘密和 API 密钥(5 项)
Claude Code 读取整个源代码树并输出整个文件。您上下文中的秘密将成为输出中的秘密。
- PRE — Create
.claude/CLAUDE.mdwith security policies. 添加:“Security Rules: 切勿将 service_role 密钥内联到客户端捆绑包中。始终通过仅服务器端点路由敏感操作。验证 NEXT_PUBLIC_* 环境变量仅包含安全值(无密钥,无令牌)。” Claude Code 读取.claude/CLAUDE.md以获取项目指导。 - PRE — Ensure
.env.localis in.gitignore. Claude Code 可能会在重构期间意外提交.env.local。运行git ls-files .env*以检查跟踪的内容。如果.env.local存在,则它被暴露。 - PRE — Audit generated API routes for env-var verification. Claude Code 有时会忘记在使用
process.env.SECRET之前验证服务器端是否存在。如果缺少环境变量,路由应该快速失败,而不是变成默认值。 - PRE — Check the
.claudecache directory. Claude Code 将对话上下文缓存在.claude/cache或.claude/history中。不应提交这些文件。将.claude/添加到.gitignore。 - POST — Run secrets.browser-storage on the deployed app. 如果Claude Code 内联了一个键,被动扫描将在渲染的包中找到它。
数据库访问控制(4项)
Claude Code 非常擅长生成模式,但 RLS 策略需要明确的指令。
- PRE — Instruct Claude Code on RLS in
.claude/CLAUDE.md. 添加:“每个迁移都必须包括ALTER TABLE ... ENABLE ROW LEVEL SECURITY和FORCE ROW LEVEL SECURITY。每个策略都必须验证用户的auth.uid()。” - PRE — Review generated migrations for
FORCE ROW LEVEL SECURITY. Claude Code 可能会生成ENABLE但忘记FORCE。如果没有FORCE,表所有者(迁移运行者)将绕过RLS。如果缺少请手动添加。 - DEPLOY — Test RLS enforcement after deploy. 打开Supabase Studio,选择一个表,确认RLS 切换为ON。如果Claude Code 的迁移使用
ENABLE而没有FORCE,则切换将显示ON,但执行不完整。 - POST — Run the baas.supabase-rls active check. 它尝试使用匿名密钥进行写入。如果成功,RLS 就不完整。将
FORCE添加到迁移并重新部署。
身份验证和会话(4 项)
Claude Code 可以很好地生成身份验证流程,但不会自动添加速率限制或验证服务器端的所有令牌声明。
- PRE — Mandate server-only auth verification in
.claude/CLAUDE.md. 添加:“每个改变数据的API 路由都必须在服务器上使用await supabase.auth.getUser()验证用户。切勿信任请求正文中的getSession()或用户ID。” - PRE — Check generated auth handlers for token expiry. Magic-link 和密码重置令牌需要服务器强制
expires_at。询问Claude Code:“添加一项拒绝超过 1 小时的令牌的检查。” - PRE — Verify sign-in redirect guards.
next参数重定向必须以/开头,而不是//。添加到.claude/CLAUDE.md:“验证next参数:必须以/开头,如果以//开头或包含协议则拒绝。” - POST — Test logout clears cookies. 登录、注销、检查应用程序 → Cookie。必须清除会话 cookie。如果它持续存在,则注销端点不会破坏状态。
HTTP 标头和CSP(3 项)
Claude Code 默认情况下不会生成中间件,除非您要求。
- PRE — Add middleware request to
.claude/CLAUDE.md. 包括:“使用每个请求的随机数、HSTS、X-Frame-Options 和 X-Content-Type-Options 标头生成src/middleware.ts和 Content-Security-Policy。”然后请Claude Code实现它。 - PRE — Verify
src/middleware.tsexists and has CSP. 对于Next.jssrc/布局,中间件必须位于src/middleware.ts,而不是项目根目录。验证 CSP 标头包含'strict-dynamic'和随机数。 - POST — Run headers.security-headers on the deployed URL. 检查报告丢失的标头并建议针对您的平台进行修复。
部署卫生(4 项)
Claude Code 不会配置您的部署平台——这是您的责任,但值得检查。
- DEPLOY — Scope env vars per environment in Vercel (or equivalent). 设置 → 环境变量 → 将每个秘密仅分配给Production。切勿与预览版或开发版共享
sk_live_*。 - DEPLOY — Audit your CI workflow for secret echo. 如果GitHub 操作或其他CI 在任何地方都有
echo $SECRET,请将其删除。构建日志已存档;日志中的秘密被泄露。 - DEPLOY — Prefer platform-native secret storage.Vercel的设置→环境变量已加密; GitHub 操作秘密总比没有好,但与平台本机存储不匹配。
- POST — Rotate any key that reached a public build. 如果密钥出现在 Vercel 预览 URL 或任何公共工件中甚至几秒钟,它就会受到损害。立即旋转。
Claude Code特定陷阱(5 项)
Claude Code 的架构和工作流程独有的模式:
- Claude Code forks work into subagents. 在大型任务中,Claude Code 可能会生成多个子代理实例,每个实例都具有部分代码库上下文。如果一个子代理幻觉出一种秘密安全的模式,而另一个子代理却没有,就会出现不一致的情况。仔细检查最终的差异。
- Bash operations are unverified. Claude Code 直接执行bash命令。
git commit -m "fix"很方便,但如果工作目录有一个.env文件并且 glob 包含它,它就会提交。始终在Claude Code 提交之前检查git diff --cached。 - Context window boundaries create gaps. 如果您的代码库很大,Claude Code 的上下文可能会分布在多个窗口中。一个窗口的
.env.local处理可能与另一个窗口的不同。强制执行.claude/CLAUDE.md中的策略并验证输出。 - Rate-limiting is almost never added without asking. Claude Code 生成工作 CRUD 但很少包含速率限制标头或指数退避逻辑。在
.claude/CLAUDE.md中明确要求。 .claude/CLAUDE.mdis read but not enforced. Claude Code 将您的.claude/CLAUDE.md视为提示,而不是约束。如果提示与任务冲突,Claude Code 可能会忽略它。始终检查输出。
后续步骤
检查 general vibe coding security checklist 中的 44 个跨工具项,然后查看 step-by-step hardening 中的部署时模式。如果您还使用Cursor,请参阅Cursor security checklist。
