ХукБезопасность

security-scan

Автоматическое сканирование кода на SQL-инъекции, XSS и другие уязвимости при каждом Write/Edit.

Закинь в Claude, Cursor или любой AI

Описание

Простым языком

Представь охранника на воротах: перед тем как выпустить машину, он заглядывает в багажник. Этот хук делает то же самое с твоим кодом — проверяет каждый файл после изменения, не спрятал ли AI туда что-нибудь опасное.

Раньше ты мог случайно закоммитить файл с паролями или небезопасным кодом. Теперь хук сразу говорит об этом — прямо в терминале, до коммита.


Что делает

Хук security-scan сканирует каждый изменённый файл на типичные уязвимости безопасности. SQL-инъекции через конкатенацию строк, небезопасная вставка HTML без санитизации, захардкоженные секреты — всё это обнаруживается до того, как код попадёт в репозиторий.

AI-модели иногда генерируют небезопасный код — особенно при работе с запросами к БД и пользовательским вводом. Этот хук — последний рубеж перед коммитом.

Когда срабатывает

Триггер: PostToolUse — после каждого Write или Edit. Условие: файл с расширением .ts, .tsx, .js, .jsx, .py. Действие: grep-поиск по паттернам уязвимостей, вывод предупреждения при обнаружении.


Установка

  1. Добавь в .claude/settings.json конфиг для PostToolUse (см. блок ниже)
  2. Создай ~/.claude/hooks/security-scan.sh и установи права chmod +x
  3. Проверь: создай файл с 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 в хуке дешевле одного инцидента.
#Hooks#Claude Code#Quality Gates
TG

> Пока нет комментариев

Связанный контент

Похожие инструменты