敏感操作的确认机制与沙箱考量
Skills 能做的事情越多,潜在的风险就越大。一个能自动修改文件、执行数据库操作或触发部署的 Skill,如果没有适当的保护机制,可能在用户不小心的情况下造成难以逆转的损害。这一节讲如何在 Skill 设计层面建立安全护栏。
哪些操作需要确认机制
按风险从高到低分级:
| 风险级别 | 典型操作 | 推荐的保护机制 |
|---|---|---|
| 🔴 极高风险 | 删除数据、生产部署、推送代码 | 必须显式确认 + 操作日志 |
| 🟠 高风险 | 修改配置文件、数据库迁移、写入重要文件 | 显示操作预览,等待确认 |
| 🟡 中等风险 | 创建文件、运行测试、修改 Git 历史 | 在开始时告知用户即将进行的操作 |
| 🟢 低风险 | 读取文件、搜索内容、运行查询(只读) | 无需特别确认机制 |
在 Skill 中实现确认机制
Claude Code 本身有工具调用确认机制(用户可以在工具调用时选择是否允许),但 Skill 级别的确认是额外的、在提示词层面的保护:
方式一:操作预览 + 提示确认
## 执行步骤
### 阶段一:分析(不执行任何修改)
1. 收集所有需要修改的文件列表
2. 分析每个文件需要做的修改
3. 输出操作预览:
📋 即将进行的操作:
修改文件(3 个): - src/api/auth.ts:添加速率限制中间件(第 45–52 行) - src/middleware/index.ts:导出新的中间件 - tests/api/auth.test.ts:添加速率限制测试用例
预计影响: - 不修改数据库结构 - 不影响现有 API 行为 - 新增 3 个测试用例
请确认以上操作后,我将开始修改。(如不确认,直接关闭对话即可)
### 阶段二:执行修改(等待用户在对话中回复确认后)
4. 用户确认后,依次修改上述文件
重要说明:Claude Code 本身没有"暂停等待用户输入"的机制。实践中,"确认"通常意味着: 1. Skill 输出操作预览后停止 2. 用户在对话中输入"继续"或"ok" 3. Claude 才执行实际修改
这个设计确保了用户在看到即将发生的修改后,有机会叫停。
方式二:dry-run 模式
这是最常用的模式,让用户先看到结果,再决定是否执行:
## 参数说明
- `--dry-run`(可选):只分析不执行,输出"如果执行将会发生什么"
## 执行步骤
1. 检查是否有 `--dry-run` 参数
2. **如果是 dry-run 模式**:
- 执行所有只读分析步骤
- 在输出中清楚标注"[DRY RUN]"
- 不执行任何修改操作
- 在输出末尾提示:
```
ℹ️ 以上是 dry-run 模式的分析结果。
运行 /migrate-check --env production(不带 --dry-run)将实际执行上述操作。
```
3. **如果不是 dry-run 模式**:
- 先执行分析,输出预览
- 然后执行实际修改
高风险 Skill 的设计模式
模式一:生产环境双重防护
## 执行步骤
1. 解析 `--env` 参数
2. **如果 `--env` 为 `production`**:
a. 输出醒目的环境确认:
```
⚠️⚠️⚠️ 生产环境操作确认 ⚠️⚠️⚠️
你即将对 PRODUCTION 环境执行以下操作:
[操作摘要]
生产环境当前状态:
- 最后部署:[时间]
- 当前版本:[版本号]
- 在线用户:[如果可获取]
请仔细确认后继续。
```
b. 继续执行前置检查(更严格的标准)...
模式二:不可逆操作的明确标注
## 执行步骤
3. 执行数据库迁移:
**注意:以下操作不可撤销**
- 将删除 `users` 表的 `legacy_email` 列
- 该列包含约 50,000 行数据
- 删除后无法通过迁移脚本恢复(需要从备份恢复)
在继续之前:
- 确认已完成数据备份
- 确认此列的数据已无需保留(已迁移到新结构)
如已确认,运行:`npm run db:migrate up`
模式三:操作日志
## 执行步骤
5. 执行完毕后,记录操作日志:
使用 Write 工具(如果 `.claude/` 目录存在),将操作记录追加到 `.claude/audit.log`:
格式:
```
[时间] [操作者: 当前 git user.email] [Skill: deploy-check]
目标:{env}
操作:[操作摘要]
结果:成功/失败
```
注意:如果 `.claude/` 目录不存在,跳过此步骤(不要创建目录)。
沙箱考量
什么是 Skill 的"沙箱"
Skills 在 Claude Code 进程的权限下运行,这意味着: - 它能访问当前用户有权访问的所有文件 - 它能执行当前用户有权执行的所有命令 - 没有真正的进程级隔离
因此,"沙箱"在 Skills 语境中主要是指:通过 settings.json 的权限配置和 Skill 文件中的行为约束来实现的"软性隔离"。
通过 settings.json 建立软性沙箱
{
"permissions": {
"allow": [
"Read(src/**)",
"Read(tests/**)",
"Read(package.json)",
"Bash(npm test:*)",
"Bash(npm run lint:*)",
"Bash(git log:*)",
"Bash(git diff:*)"
],
"deny": [
"Read(/etc/**)",
"Read(~/.ssh/**)",
"Read(.env*)",
"Write(*)",
"Bash(git commit:*)",
"Bash(git push:*)",
"Bash(rm:*)",
"Bash(sudo:*)"
]
}
}
对于高风险操作,考虑专用账号
在 CI/CD 或自动化场景中,如果 Skills 需要执行更高权限的操作: - 考虑使用权限受限的服务账号运行 Claude Code - 对于生产操作,通过 CI/CD 管道(而非本地 Claude Code)执行 - Skills 只生成操作计划,由人工或受控的自动化系统执行
本节记录清单
- [ ] 审查你的 Skills 列表,对每个 Skill 按风险级别分类
- [ ] 为所有高风险 Skill 添加
--dry-run参数支持 - [ ] 为生产环境操作 Skill 添加醒目的确认提示
- [ ] 在
settings.json中配置明确的 deny 规则,限制意外操作
下一章:测试、调试与质量保障——权限配置好了,如何确保 Skill 的执行结果是正确的?如何发现并修复 Skill 的缺陷?