"AI 写的代码又快又多,但合进去之后才发现——有人在 commit 里留下了云服务密钥,有人让 AI 把生产库的表给改了,还有个同事的 Prompt 里暴露了客户手机号。这些问题不是 AI 的错,是我们的流程没拦住。"
在AI Coding阶段容易被低估的功能就是 Hooks机制——它不是让 AI 写得更快,而是让 AI 写得更安全。本文帮你在 AI 编码的五个关键时刻插入安全检查。
AI 编码的速度是人的 5-10 倍。一个开发者在 IDE 里聊几句就能生成上百行代码。但问题也出在这里:
写得太快,快到人来不及检查。
传统的防线是这样的:代码写完了 → 提交 → PR → 人工 Review → 发现问题 → 打回修改。这条链路的平均时长是 2-4 小时。AI 呢?生成 100 行代码只要 30 秒。防线速度跟不上生成速度。
所以问题的本质不是"AI 写的代码质量差",而是"旧流程的设计假设是代码生产速度慢"。当生产速度翻了 10 倍,你不应该在终点加更多审查者,而应该在过程中就装上自动刹车。
这就是 Pre-commit Hooks 和 Qoder Hooks 要解决的问题。
很多AI IDE引入了 Hook 机制,允许在 AI Agent 执行流程中插入自定义脚本。五个关键时刻:
时机 | 事件名 | 能干什么 | 能阻断吗 |
|---|---|---|---|
用户提交 Prompt 后 | UserPromptSubmit | 检查 Prompt 是否含敏感信息 | ✅ 能阻断 |
工具调用前 | PreToolUse | 拦截危险命令(rm -rf 等) | ✅ 能阻断 |
工具调用后 | PostToolUse | 自动格式化代码、跑 Lint | 不阻断 |
工具调用失败后 | PostToolUseFailure | 记录日志、发送告警 | 不阻断 |
Agent 停止时 | Stop | 保存对话历史、生成摘要 | 不阻断 |
把这五个时刻和传统的 Git Pre-commit 结合起来,你就有了一张完整的拦截网:
写代码时 L0 写时约束(Spec、Rules)
保存时 L1 IDE 检查(语法、类型)
commit 时 L2 Pre-commit Hook(Lint、单元测试)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
push 前 L3 Qoder Hook · 用户Prompt提交 → 敏感信息检查
L3 Qoder Hook · 工具调用前 → 危险命令拦截
L3 Qoder Hook · 工具调用后 → 自动格式化 + Lint
PR 时 L5 代码评审(AI Review + 人工 Review)
上线前 L6 部署前扫描
L2 和 L3 是"AI 编码场景"下最关键的两层。传统的 L2(Pre-commit)只能拦住常规问题(格式、基础安全),但 AI 特有的风险——Prompt 泄露敏感数据、生成危险命令、写入不该写的路径——必须在 L3 层拦截。
AI 有时候会在写代码的过程中执行 Shell 命令。如果一个 Prompt 让它"清理一下临时文件",它可能执行 rm -rf /tmp/cache。但这行命令如果少了 /tmp,后果不堪设想。
#!/bin/bash
# 保存为 ~/.lingma/hooks/block-dangerous.sh
# chmod +x ~/.lingma/hooks/block-dangerous.sh
input=$(cat)
command=$(echo "$input" | jq -r '.tool_input.command // ""')
# 黑名单:这些命令不管什么参数都拦截
if echo "$command" | grep -qE 'rm\s+-rf\s+/|DROP\s+TABLE|mkfs|dd\s+if=.*of='; then
echo "🚫 危险命令已被 Qoder Hook 拦截: $command" >&2
echo "如需执行此操作,请手动在终端中运行并确认。" >&2
exit 2
fi
exit 0
配置到 AI IDE:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "~/.qoder/hooks/block-dangerous.sh"
}
]
}
]
}
}
工程师有时候会在 Prompt 中粘贴包含客户数据的日志、带有 API Key 的配置文件、甚至数据库连接串。这些内容一旦上传到云端 AI 服务,就是合规事故。
#!/bin/bash
# 保存为 ~/.lingma/hooks/check-prompt.sh
input=$(cat)
prompt=$(echo "$input" | jq -r '.prompt // ""')
# 检测常见敏感信息模式
patterns=(
'password\s*[:=]\s*\S+'
'api_key\s*[:=]\s*\S+'
'secret\s*[:=]\s*\S+'
'token\s*[:=]\s*\S+'
'1[3-9]\d{9}'
'AKIA[0-9A-Z]{16}'
)
for pattern in "${patterns[@]}"; do
if echo "$prompt" | grep -qiE "$pattern"; then
echo "⚠️ 你的 Prompt 可能包含敏感信息(匹配模式: $pattern)" >&2
echo "请检查并脱敏后重新提交。这会触发合规风险。" >&2
exit 2
fi
done
exit 0
AI 生成的代码有时缩进、换行和项目的 ESLint 规则不一致。让 Hook 在 AI 写完文件后自动格式化:
#!/bin/bash
# 保存为 .lingma/hooks/auto-format.sh
input=$(cat)
file=$(echo "$input" | jq -r '.tool_input.file_path // ""')
# 只对前端项目生效
if [[ "$file" == *.tsx ]] || [[ "$file" == *.ts ]] || [[ "$file" == *.js ]]; then
npx prettier --write "$file" 2>/dev/null
echo "✓ 已自动格式化: $file"
fi
exit 0
Pre-commit 管"提交前的那一瞬间",Hooks 管"AI 执行过程中的每一个关键节点"。两者不是替代关系,是上下游:
开发者写 Prompt → [UserPromptSubmit Hook: 检查敏感信息]
↓
AI 开始执行 → [PreToolUse Hook: 拦截危险命令]
↓
AI 写文件 → [PostToolUse Hook: 自动格式化]
↓
开发者 git add
↓
git commit → [Pre-commit Hook: Lint + 单元测试]
↓
git push → [CI 流水线]
一个完整的项目级 .pre-commit-config.yaml可能是这样的:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: detect-private-key
- id: detect-aws-credentials
- repo: local
hooks:
- id: eslint
name: ESLint
entry: npx eslint --fix
language: system
types: [javascript]
- id: qoder-review
name: Qoder AI Review
entry: qodercli review --staged
language: system
pass_filenames: false
配合 Qoder 的 settings.json,你给 AI 编码装了五道自动刹车。
很多团队卡在这里:Demo 跑通了,AI 确实能写代码。但要上生产,CTO 问的第一个问题就是——"安全吗?出了事谁负责?"
Hooks + Pre-commit 就是这个问题的答案。它不靠人盯着,不靠"我相信我的工程师不会犯错",而是靠机制。
而且这套体系的部署成本很低:三个脚本加起来不到 50 行,复制粘贴、改权限、重启 IDE,15 分钟搞定。投入 15 分钟,给所有 AI 生成的代码装上一套免疫系统。