在AI辅助编程阶段,一项常被低估的能力其实是Hooks机制——它并非单纯让AI写得更快,而是让AI写得更安全。本文就来探讨如何在AI编码的五个关键节点上部署安全检查。

01 | 为什么光靠“人工审查”远远不够
AI写代码到底有多快?业界公认是5到10倍。开发者在IDE里简单对话几句,上百行代码就能生成。但问题也随之而来:生成速度太快,快到人类根本来不及逐行检查。
传统的安全防线是什么样的?代码写完 → 提交 → PR → 人工评审 → 发现问题 → 打回修改。这条流程走下来,平均耗时2到4小时。而AI呢?生成100行代码只需要30秒。防线的响应速度,完全跟不上生成速度。
所以问题的本质,并不是“AI生成的代码质量差”,而是“旧有流程的设计前提是代码生产缓慢”。当生产效率提升10倍,你绝不能在终点单纯增加更多审查者,而必须在生成过程中就嵌入自动刹车机制。
这正是Pre-commit Hooks与Qoder Hooks需要解决的问题。
02 | 防线应部署在五个关键节点
目前不少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层面提前拦截。
03 | 三个最实用的 Hook 脚本
脚本一:拦截危险命令
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 -rf /|DROP TABLE|mkfs|dd 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 敏感信息检查
工程师有时会在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 生成的代码
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
04 | Pre-commit 和 Hooks 如何协同工作
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: [ja vascript]
- id: qoder-review
name: Qoder AI Review
entry: qodercli review --staged
language: system
pass_filenames: false
配合Qoder的 settings.json,你就能为AI编码安装五道自动刹车系统。
05 | 从 Demo 到生产的最后一公里
许多团队卡在这个环节:Demo跑通了,AI确实能写代码。可一旦要上生产,CTO问的第一个问题就是——“安全吗?出了事谁负责?”
Hooks + Pre-commit,正是这个问题的答案。它不依赖人工盯着,不依赖“我相信我的工程师不会犯错”,而是依赖机制保障。
而且这套体系的部署成本极低:三个脚本加起来不到50行,复制粘贴、修改权限、重启IDE,15分钟就能搞定。投入15分钟,就能为所有AI生成的代码植入一套完善的免疫系统。
