security-scan
Автоматическое сканирование кода на SQL-инъекции, XSS и другие уязвимости при каждом Write/Edit.
Описание
Простым языком
Представь охранника на воротах: перед тем как выпустить машину, он заглядывает в багажник. Этот хук делает то же самое с твоим кодом — проверяет каждый файл после изменения, не спрятал ли AI туда что-нибудь опасное.
Раньше ты мог случайно закоммитить файл с паролями или небезопасным кодом. Теперь хук сразу говорит об этом — прямо в терминале, до коммита.
Что делает
Хук security-scan сканирует каждый изменённый файл на типичные уязвимости безопасности. SQL-инъекции через конкатенацию строк, небезопасная вставка HTML без санитизации, захардкоженные секреты — всё это обнаруживается до того, как код попадёт в репозиторий.
AI-модели иногда генерируют небезопасный код — особенно при работе с запросами к БД и пользовательским вводом. Этот хук — последний рубеж перед коммитом.
Когда срабатывает
Триггер: PostToolUse — после каждого Write или Edit. Условие: файл с расширением .ts, .tsx, .js, .jsx, .py. Действие: grep-поиск по паттернам уязвимостей, вывод предупреждения при обнаружении.
Установка
- Добавь в
.claude/settings.jsonконфиг дляPostToolUse(см. блок ниже) - Создай
~/.claude/hooks/security-scan.shи установи праваchmod +x - Проверь: создай файл с SQL-конкатенацией и убедись, что хук выводит предупреждение
Конфиг settings.json
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "~/.claude/hooks/security-scan.sh"
}
]
}
]
}
}Скрипт хука
#!/bin/bash
# security-scan.sh — сканирование файла на уязвимости
# PostToolUse: Write | Edit
FILE="${CLAUDE_TOOL_INPUT_PATH:-}"
[ -z "$FILE" ] && exit 0
case "$FILE" in
*.ts|*.tsx|*.js|*.jsx|*.py) ;;
*) exit 0 ;;
esac
WARN=0
# SQL Injection: конкатенация строк в запросах
if grep -nqE 'f"[^"]*SELECT|f"[^"]*INSERT|f"[^"]*UPDATE' "$FILE" 2>/dev/null; then
echo "WARN [security-scan] Возможная SQL-инъекция: $FILE"
WARN=1
fi
# XSS: небезопасное присваивание HTML без санитизации
XSS_PATTERN="innerHTMLs*=|dangerously.*HTML"
if grep -nqE "$XSS_PATTERN" "$FILE" 2>/dev/null; then
echo "WARN [security-scan] Небезопасная вставка HTML: $FILE"
WARN=1
fi
# Захардкоженные секреты
if grep -nqE 'sk-[a-zA-Z0-9]{20,}|ghp_[a-zA-Z0-9]{36}|AKIA[A-Z0-9]{16}' "$FILE" 2>/dev/null; then
echo "CRITICAL [security-scan] Захардкоженный секрет: $FILE"
WARN=1
fi
# Python: небезопасный yaml и pickle
if [[ "$FILE" == *.py ]]; then
if grep -nqE 'yaml.load(' "$FILE" 2>/dev/null; then
echo "WARN [security-scan] yaml.load без SafeLoader: $FILE"
WARN=1
fi
if grep -nqE 'pickle.loads?(' "$FILE" 2>/dev/null; then
echo "WARN [security-scan] Небезопасный pickle.load: $FILE"
WARN=1
fi
fi
if [ "$WARN" -eq 0 ]; then
echo "OK [security-scan] $FILE"
fiПримеры работы
Хук не блокирует операцию — только выводит предупреждения в консоль. AI видит вывод и обязан исправить проблему до коммита.
Что пропускает
- Файлы без кода:
.md,.json,.yaml,.env.example - Файлы в
node_modules,dist,.next - Намеренные паттерны с комментарием
# nosec
Что обнаруживает
- SQL через f-строки Python: конкатенация запросов с переменными
- Захардкоженные OpenAI ключи формата
sk-proj-... - Небезопасная вставка HTML в DOM без санитизации
yaml.load()без явногоLoader=yaml.SafeLoader- Небезопасный
pickle.loadиз ненадёжных источников
Настройка под себя
Добавляй собственные паттерны в grep-выражения под свой стек.
- Расширяй паттерны grep под свой стек
- Добавь
# nosecкомментарий для ложных срабатываний - Замени вывод предупреждения на
exit 2для критических паттернов - Настрой список расширений через переменную
SCAN_EXTENSIONS
Security через страх не работает. Security через автоматику — работает. Один grep в хуке дешевле одного инцидента.
> Пока нет комментариев
Связанный контент
Похожие инструменты
/pre-commit-check
Проверки перед коммитом: security scan, lint, типы, debug-код. Всё в одной команде.
Открыть →branch-guard
Блокирует прямой push в main/master. Предлагает создать PR через GitHub CLI.
Открыть →destructive-guard
Блокирует деструктивные bash-команды: rm -rf, DROP TABLE, git reset --hard. Спрашивает подтверждение.
Открыть →protect-secrets
Блокирует запись файлов с секретами: .env, токены, пароли, приватные ключи. Не даёт случайно закоммитить.
Открыть →