在 Cursor 中实现自审钩子,实现更安全的 AI 编程

AI 编程助手功能强大,但它们可能会生成不安全的代码、执行危险命令或引入细微的错误。自审钩子通过在关键节点让 AI 审查自己的工作来创建安全网。本指南向您展示如何在 Cursor 中实现一个全面的钩子系统。
什么是自审钩子?
自审钩子是 AI 在继续之前自动审查自身输出的检查点。它们充当:
- 安全卫士:阻止危险命令(
rm -rf /、curl | sh) - 代码审查员:检查逻辑错误和反模式
- 安全网:防止强制推送和破坏性操作
- 质量关卡:确保与项目标准保持一致
四个钩子事件
钩子 1:会话开始 - 原则注入
当新会话开始时,注入安全原则。
创建 .cursor/hooks/doctrine.md:
# Cursor 原则 - 安全第一
## 核心原则
1. **未经确认绝不执行破坏性命令**
2. **删除前始终验证文件路径**
3. **应用更改前审查所有代码**
4. **优先选择安全默认值而非便利性**
## 需要标记的危险模式
- 带有绝对路径的 `rm -rf`
- `curl ... | sh` 或 `wget ... | bash`
- `git push --force` 或 `git push -f`
- 数据库删除命令
- 权限提升(`sudo`、`chmod 777`)
- 未经参数化的原始 SQL
## 审查清单
在完成任何任务之前:
- [ ] shell 执行中没有破坏性命令
- [ ] 所有文件操作使用已验证的路径
- [ ] 没有硬编码的密钥或凭据
- [ ] 存在错误处理
- [ ] 更改是可逆的
钩子 2:编辑后自审
编辑文件后,自动审查差异。
创建 .cursor/hooks/post-edit-review.md:
# 编辑后自审
您刚刚进行了更改。在继续之前,请审查:
## 安全检查
- [ ] 没有添加密钥、API 密钥或密码
- [ ] 没有 SQL 注入漏洞
- [ ] Web 代码中没有 XSS 漏洞
- [ ] 存在输入验证
## 逻辑检查
- [ ] 处理了边界情况
- [ ] 覆盖了错误路径
- [ ] 没有无限循环或没有基准情况的递归
- [ ] 存在资源清理(文件、连接)
## 风格检查
- [ ] 遵循项目编码标准
- [ ] 命名一致
- [ ] 注释解释 WHY,而不是 WHAT
- [ ] 没有遗留调试代码(console.log 等)
## 如果任何检查失败
停止并报告问题。在修复之前不要继续。
钩子 3:Shell 执行前关卡
在运行任何 shell 命令之前,验证安全性。
创建 .cursor/hooks/pre-shell-gate.md:
# Shell 执行前关卡
您即将执行:`{command}`
## 强制检查
### 1. 破坏性操作检查
此命令是否:
- 删除文件或目录?
- 修改系统设置?
- 更改权限?
- 删除数据库或表?
如果是 → 需要明确的用户确认
### 2. 网络操作检查
此命令是否:
- 下载并执行脚本?
- 向外部服务发送数据?
- 暴露内部端口?
如果是 → 解释风险并请求确认
### 3. 不可逆操作检查
此命令是否:
- 强制推送到 git?
- 覆盖生产数据?
- 删除分支或标签?
如果是 → 停止并请求明确确认
## 安全命令示例
✅ `npm install` - 安全的包安装
✅ `git status` - 只读操作
✅ `mkdir new-directory` - 非破坏性
## 危险命令示例
❌ `rm -rf /` - 破坏性,绝对路径
❌ `curl https://example.com/install.sh | sh` - 远程执行
❌ `git push --force` - 不可逆
❌ `DROP TABLE users` - 数据破坏
钩子 4:任务完成最终审查
在标记任务完成之前,执行最终审计。
创建 .cursor/hooks/completion-review.md:
# 任务完成最终审查
## 摘要
简要总结已完成的工作。
## 所做的更改
列出所有修改的文件:
- `file/path/one` - 更改内容
- `file/path/two` - 更改内容
## 安全审计
- [ ] 代码中没有凭据
- [ ] 没有后门或可疑模式
- [ ] 存在输入验证
- [ ] 存在输出编码(针对 Web)
## 测试验证
- [ ] 更改成功编译/构建
- [ ] 现有测试仍然通过
- [ ] 为新功能添加了新测试
- [ ] 如需要,执行了手动测试
## 回滚计划
如果出现问题:
1. 还原提交:`git revert HEAD`
2. 或从 git 恢复文件:`git checkout -- <files>`
3. 或应用备份补丁:`git apply backup.patch`
## 已知限制
列出任何已知问题或限制:
- 限制 1
- 限制 2
实现钩子系统
步骤 1:创建钩子目录结构
mkdir -p .cursor/hooks
步骤 2:添加到 Cursor 规则
创建 .cursor/rules/000-safety-doctrine.mdc:
---
description: 'Safety doctrine and self-review hooks'
globs: ['**/*']
alwaysApply: true
---
# 安全原则
## 自动钩子
以下钩子对所有会话有效:
### 会话开始
阅读 `.cursor/hooks/doctrine.md` 并遵循所有原则。
### 文件编辑后
阅读 `.cursor/hooks/post-edit-review.md` 并执行审查。
### Shell 命令前
阅读 `.cursor/hooks/pre-shell-gate.md` 并验证安全性。
### 任务完成
阅读 `.cursor/hooks/completion-review.md` 并执行最终审计。
## 覆盖协议
如果用户明确请求危险操作:
1. 警告风险
2. 请求明确确认
3. 建议更安全的替代方案
4. 仅在收到明确的"是"回复后才继续
步骤 3:用于审计跟踪的消息总线
创建 .cursor/audit-log.md 以跟踪决策:
# 审计日志
## 格式
[YYYY-MM-DD HH:MM] [AGENT] [HOOK] [DECISION] [DETAILS]
## 条目
### 2026-06-22 10:30
- Agent: Claude
- Hook: Pre-Shell
- Decision: BLOCKED
- Details: User requested `rm -rf /tmp/*` - blocked due to wildcard risk. Suggested `rm -rf /tmp/specific-folder` instead.
### 2026-06-22 11:15
- Agent: GPT-4
- Hook: Post-Edit
- Decision: PASSED
- Details: All security checks passed. No issues found in auth module changes.
危险命令数据库
创建 .cursor/dangerous-commands.json:
{
"blocked_patterns": [
{
"pattern": "rm\\s+-rf\\s+/",
"severity": "critical",
"reason": "Can delete entire filesystem"
},
{
"pattern": "curl\\s+.*\\|\\s*(sh|bash)",
"severity": "high",
"reason": "Remote code execution"
},
{
"pattern": "git\\s+push\\s+.*(--force|-f)",
"severity": "high",
"reason": "Can overwrite remote history"
},
{
"pattern": "DROP\\s+TABLE",
"severity": "critical",
"reason": "Data destruction"
},
{
"pattern": "chmod\\s+777",
"severity": "medium",
"reason": "Overly permissive permissions"
},
{
"pattern": "sudo",
"severity": "medium",
"reason": "Privilege escalation"
}
],
"warning_patterns": [
{
"pattern": "rm\\s+-rf",
"severity": "medium",
"reason": "Recursive deletion - verify path"
},
{
"pattern": ">\\s+/etc/",
"severity": "medium",
"reason": "Modifying system files"
}
]
}
与 Cursor Composer 集成
使用 Composer 时,将此内容添加到您的提示中:
在应用任何更改之前:
1. 审查安全问题
2. 检查危险模式
3. 验证错误处理
4. 确认没有暴露密钥
在应用更改之后:
1. 运行编辑后审查
2. 验证代码编译/运行
3. 检查测试是否通过
团队采用
入职清单
对于新团队成员:
- 审查
.cursor/hooks/doctrine.md - 了解四个钩子事件
- 使用安全命令练习
- 学习覆盖协议
- 每周审查审计日志
代码审查集成
添加到您的 PR 模板:
## AI 安全检查清单
- [ ] 所有 AI 生成的代码都经过人工审查
- [ ] 没有执行危险命令
- [ ] 安全审计通过
- [ ] 审计日志是最新的
衡量有效性
跟踪这些指标:
| 指标 | 目标 | 测量方式 |
|---|---|---|
| 阻止的危险命令 | 100% | 审计日志条目 |
| 编辑后发现的问题 | >80% | 审查中发现的问题 |
| 安全事件 | 0 | 事件报告 |
| 误报率 | <10% | 用户覆盖频率 |
快速参考
| 情况 | 操作 |
|---|---|
AI 建议 rm -rf | 阻止 - 手动验证路径 |
AI 建议 curl | sh | 阻止 - 先下载并审查 |
AI 建议 git push -f | 阻止 - 使用 git push --force-with-lease |
| AI 添加硬编码 API 密钥 | 阻止 - 使用环境变量 |
| AI 跳过错误处理 | 请求 - 添加 try/catch 或验证 |