
很多人会答:我在 prompt 里写了,不要读密钥。
不够。
因为 prompt 是建议,不是执行边界。
真正该问的是:读之前,会不会进执行器?
🎯 这题为什么容易翻车?
“看到 .env”其实混了 3 件事:
• 能不能读 .env 文件
• 能不能读 API_KEY 这类环境变量
• 读到后会不会写日志、塞进上下文、甚至外发
模型嘴上说“不碰”,和程序层真的拦住,是两回事。
💡 权限系统该怎么设计?
核心不是让模型更乖,而是:
对一次具体工具请求,程序现在允不允许执行。
FirstCoder 里的链路是:
ToolPermissionSpec
→ PermissionRequest
→ PermissionManager
→ grant 命中?用 grant : 默认 policy
→ ALLOW / ASK / DENY
→ 只有 ALLOW 才进 executor
关键点:
• DENY:直接回 tool result,不执行
• ASK:暂停当前 turn,等用户确认
• 模型不能自己改授权,也不能绕过 registry
所以安全 review 时,优先看这条链,不看 prompt 写得多吓人。
🛡 .env 具体怎么处理?
默认策略大概是:
• 项目内普通文件:通常可读
• .env / .pem / .key:当敏感路径,需要确认
• 名称带 KEY / TOKEN / SECRET / PASSWORD 的环境变量:默认拒绝明文
• 项目外删除:直接拒绝
所以更准确的回答是:
不是“模型想读就能读”
而是:
读 .env 文件 → 敏感路径 → 询问
读敏感 env key → policy 直接拒绝
📌 两个容易忽略的点
1. ASK 不是弹个窗就完了
要保住原来的 tool call。
用户点允许后,执行的必须是刚才那次请求,不能让模型重新说一遍。
2. “本次允许” ≠ “始终允许”
• 本次:只过这一次
• 始终:落到明确 scope(路径 / 命令前缀 / host / env key)
不能存成一句模糊的“以后都行”
📚 一句话总结
prompt 负责引导行为
permission 负责阻止越权执行
agent 的能力边界,最后一定落在执行链上。
🔗 开源地址
https://github.com/KomorGiaoGiao/FirstCoder
想看实现优先翻:
permissions/ 和 permission_registry.py
欢迎 star⭐,也欢迎对着代码挑刺。
