TwKit
正在载入
TwKit

CLAUDE.md 里写了“绝不读 .env”就安全了?Anthropic 官方出来拆台了:不能有例外的规矩,别写给模型听,要交给程序去强制 这是 Anth… · @swordBluesy · TwKit

@swordBluesy

CLAUDE.md 里写了“绝不读 .env”就安全了?Anthropic 官方出来拆台了:不能有例外的规矩,别写给模型听,要交给程序去强制 这是 Anthropic 的 Claude Code 官方文档《Best practices for Claude Code》的后半部分(这是第 2/2 部分)。先把结论放在前面,因为它反常识: 官方原话是,如果某件事每次都必须发生,就把它做成 hook(钩子)、deny 规则(禁止规则)或托管设置;CLAUDE.md 只是“指南”,Claude 有权判断某条指南这次不适用。像“绝不读 .env”这种规矩,Claude 几乎每次都会遵守,但“几乎”不够的,就要从 CLAUDE.md 搬进由 Claude Code 自己执行的配置里。 先说清词。 hook(钩子),是你写的一段命令,在 Claude 干活的固定节点自动运行,比如改完文件之后、想收工之前。它不靠模型记得,到点就执行。 deny 规则(禁止规则),是写在设置文件里的“绝对不许”,官方说它在所有权限模式下都生效,包括自动模式和 bypassPermissions。 沙盒(sandbox),是操作系统层面的围栏,限制 Claude 的命令能碰哪些文件和网络。 worktree(工作树),是同一个仓库的另一份独立检出,让几个会话各改各的文件,互不撞车。 一个真实例子:官方把“改完文件要跑格式化”做成 PostToolUse 钩子,匹配 Edit 或 Write,命令是用 prettier 格式化被改的文件。以后 Claude 记不记得这条规矩都无所谓,因为跑它的不是 Claude。 先把话说全: 官方强调钩子只用于“零例外”的规矩,像“优先用具名导出”例外很多,就留在 CLAUDE.md 里。 官方警告:自动模式是分类器模型在判断,不是硬规则,也可能判错,所以你的“绝不”要写成 deny 规则或钩子。 这篇是官方文档的后半部分,前半部分(具体提示词、采访式写规格、给检查)在前一篇。 一、第一步:强制规矩,用钩子 钩子可以运行:一条 shell 命令(最常见)、一个 HTTP 请求、你的 MCP 服务器上的一次工具调用,或者 prompt、agent 钩子(让另一个模型来判断)。官方提醒:prompt 或 agent 钩子是让别的模型决定,同样不是确定性的;真要强制,用 command 或 http 钩子,并加上 onFailure 设为 block,这样钩子自己崩了或超时,也会拦住动作。 迁移规则那条,官方的做法是 PreToolUse 钩子,对 migrations 目录下的路径以退出码 2 拦截。你不用自己写,直接对 Claude 说“write a hook that blocks edits to the migrations folder”,再用 /hooks 看结果。 二、第二步:用权限规则和沙盒限制访问 官方示例:在 .claude/settings.json 里写 permissions,allow 放 Bash(pnpm tsc --noEmit),ask 放 Bash(git push *),deny 放 Read(./.env)、Read(./.env.local)、Read(./secrets/ 整个目录,官方写法是 secrets 后面加两个星号的通配)。存好后让 Claude 去看 .env 里有什么,用 Read 工具和 cat .env 都会失败。 官方也说清了边界:Read 规则能拦住 cat .env,因为 Claude Code 认得常见的读文件命令;但拦不住一个自己打开文件的脚本;对某个域名的 WebFetch 禁止规则,管不到对同一个域名的 curl,除非开了沙盒。 想要操作系统级的限制,在会话里输入 /sandbox 打开沙盒,它在 macOS、Linux 和 WSL2 上限制 Claude 的 shell 命令,也会读取你的 Read 禁止规则和 WebFetch 域名规则。官方的话:凡是安全相关的,两者都要。默认 Claude 还可以申请在沙盒外重试被拦的命令,要关掉这个重试,在 /sandbox 的 Overrides 标签里开严格沙盒模式。 三、第三步:规则放在哪里,决定谁受约束 文件位置上,.claude/settings.local.json 和 ~/.claude/settings.json 只属于你自己;选“Yes, and don't ask again”时,规则存进本地文件。.claude/settings.json 和里面的钩子属于仓库,提交后所有人都受约束:它的 deny 规则立即生效,allow 规则要等每个人接受该文件夹的信任对话框。托管设置(managed settings)属于组织,来自管理控制台、MDM 或 managed-settings.json,个人设置覆盖不了。官方还劝你:强制的规则保持精简,如果你有四十条,多半大部分只是偏好。 四、第四步:改默认值,先看 /usage 官方说默认值够好,除非某个任务花的时间、token 或打断次数超标,再在会话里输入 /usage 看钱花在哪。新会话已经替你做了四个决定:终端和 VS Code 会话默认进入自动模式;多数方案默认 Claude Opus 5.5、中等强度;它觉得有必要会派子代理;对话变长会自动压缩。 权限模式:手动模式每步都要你批,批到第十次你就不看了;bypassPermissions 只适合一次性容器。自动模式在两者之间,由分类器按固定顺序检查动作,重点拦:curl 管道给 bash、生产环境部署和迁移、强推覆盖别人的工作、把敏感数据发到外部、看起来由读到的内容而不是由你驱动的动作。连续被拦三次(或总共二十次),自动模式暂停,回到问你。 官方强调:这一切在你的确定性控制之后运行,deny 规则和 PreToolUse 钩子先于分类器。在对话里说“don't push until I've reviewed”,分类器会当成拦截信号,但对话压缩时这句话可能丢,重要的仍要写 deny 规则。自动模式配置写在 ~/.claude/settings.json 的 autoMode 里,列表必须保留 "$defaults",否则你的条目会替换内置规则;autoMode 写在项目设置里会被忽略。想看每一步,按 Shift+Tab 切换权限模式,或用 claude --permission-mode manual 启动;提示太多就输入 /fewer-permission-prompts。 模型和强度:输入 /effort 调整。要把握一个容易漏掉边界情况的难题,用 /effort high 或 xhigh;来回快速试探用 /effort low;max 留给想让它自己攻克的难题,比如找安全漏洞,普通任务上容易想太多。只有下一句需要时,在提示词里写 ultrathink。简单子任务可以用 Haiku 当子代理,要用 Claude Fable 5.1,用 /model fable 明确选择。 五、第五步:知道子代理要花什么 官方列的好处:并行做独立的活、让冗长输出不进主对话、找一个没看过代码怎么写的审阅者、给任务更少的工具。成本主要是 token,因为每个子代理发自己的请求;有时还更慢,因为新子代理要重新收集上下文。默认还是同一个模型或更小的模型,你得到的是并行或新鲜的眼睛,不是更聪明的答案。 省钱办法:简单活在子代理定义里写 model: haiku;让它们回短摘要;用 /usage 看每类子代理占多少;给自定义子代理只开 tools: Read, Grep, Glob,它就成了不能改文件的审阅者,限制由 Claude Code 执行。官方给的审阅者文件是 .claude/agents/reviewer.md,设定是对照规格检查改动、只报影响正确性的缺口、跳过风格。用法:对 Claude 说“have the reviewer compare the rate limiter against SPEC.md”。 六、第六步:控制成本和上下文 每次请求都会发送整段对话,所以一个会话攒了三件不相关的事,第四件事的每一轮都要把前三件重读一遍。官方的办法:不相关的任务之间用 /clear(/clear oauth-migration 可以给要离开的会话起名,之后回来);用 /compact 时带重点,比如“/compact keep the API changes and the test commands”;留意后台工作,/loop、目标检查和子代理在你不打字时也在发请求。提示缓存在订阅账号上约一小时,在 API Key、云厂商或用量额度上约五分钟,子代理默认五分钟。 七、第七步:盯住第一分钟 官方的口诀:盯第一分钟,Claude 一跑偏就按 Esc,纠正两次还不对,就输入 /clear 重写一个更好的提示词,别纠正第三次。Esc 停下当前动作且保留之前的一切。/rewind(或空提示下按两次 Esc)回滚代码、对话或两者;注意检查点只覆盖 Claude 用自己的文件工具改的文件,只被 Bash 命令改过的文件不会还原,要和 git 配合。/btw 问一个不进历史的小问题。多天的活用 /rename oauth-migration 起名,之后 claude --resume oauth-migration 接着做。 八、第八步:让它无人值守 官方先问五个问题:它知道什么叫做完吗?能检查自己的工作吗?允许碰什么?什么会让它停下,比如 --max-turns、--max-budget-usd?结果去哪里、谁来签字?官方的话:开始、定义这次什么算完成、批准最后的合并,这三件事留给你。 脚本里跑:claude -p "提示词" 跑一次就退出。常用参数:--bare 跳过钩子、技能、插件、MCP 和 CLAUDE.md,保证到哪都一样,认证来自 ANTHROPIC_API_KEY;--allowedTools 预批准工具,--permission-mode dontAsk 拒绝其余要提示的;--output-format json 得到一个可解析的结果。官方示例是对 files.txt 里每个文件循环运行 claude --bare -p "Migrate $file to the new logger API and commit. Reply OK or FAIL.",带上 allowedTools、dontAsk 和 --max-turns 20。官方建议先拿三个文件试,再跑剩下的。 定时和事件触发:会话里用 /loop 15m 加一句话,比如检查分支上的 CI,红了就拉日志、修复并推送;笔记本合着也要跑,用 /schedule 建云端定时任务,需要 http://claude.ai 登录。官方警告:放任云端任务前,先给 main 分支设一条任务绕不过的 GitHub 分支规则,新任务先看前几次运行。 并行会话:claude -w feature-auth 在新 worktree 里开会话。worktree 是全新检出,.env 这类被 git 忽略的文件不会带过去,把它们列进仓库根目录的 .worktreeinclude(语法同 .gitignore),Claude Code 会复制进每个 worktree;只放小文件,node_modules 之类大目录用 worktree.symlinkDirectories。一次大批量机械改动用 /batch,它拆成 5 到 30 个单元、先给你看计划,再各在自己的 worktree 里跑并开 PR。第二个会话是最容易得到的独立审阅者:一个写,另一个审,你来传话。 九、官方列出的“可以不再做的事” 上下文窗口是主要限制要拼命管理:多数现在的模型有 1M 窗口,会自动压缩,很少用完,但任务之间 /clear 仍值得做。给没遵守的指令加 IMPORTANT 或全大写:现在的模型照常写的句子就会遵守,堆强调反而让它过度执行,不能弯的规矩做成钩子或 deny 规则。为保护上下文而用子代理、为得到更好答案而委托子代理:都不成立,新鲜审阅者有用是因为没看过你的推理。在提示词里写 think hard:强度由 /effort 控制,ultrathink 仍管用。告诉它别偷懒一直干:现在的模型会自己做完,这类话更容易导致做过头;给它一个要通过的检查才有用。在 CLAUDE.md 里描述架构和文件布局:Claude 自己读仓库,只写仓库里没有的。 原文链接:https://code.claude.com/docs/en/best-practices 原文:Anthropic(由 S1哥 编译) S1哥观点 这篇文档最狠的地方,是它把我们最常用的偷懒办法判了刑:在 CLAUDE.md 里再加一句“绝对不要”。官方的意思很直白,写给模型听的话叫建议,建议是可以被理解成“这次例外”的。 真正的信号是,AI 越强,越不该靠它自觉,该靠围栏。就像公司制度:口头叮嘱人人说好,真正的红线是财务系统里改不了的权限。它和 Claude Duet 的关系也一样:给 Duet 授权访问账号时,也先想清楚哪些事“不许例外”。 评论区二选一:你现在最想强制的一条规矩是“不许读密钥文件”还是“改完必须自动跑格式化”?这是 Claude 全家桶小白系列第9篇(《Best practices for Claude Code》第 2/2 部分),前几篇在我主页,关注 @swordBluesy。 今天送:Claude Code 强制规矩模板(钩子、禁止规则、无人值守检查清单),评论区第一条直接拿。

曝光 485 · 评论 9 · 点赞 3 · 书签 1

查看原帖