0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeがデータベースを消した。2回。——フックで防ぐ方法

0
Last updated at Posted at 2026-04-16

1週間で2件、Claude Codeがデータベースを消す事故が報告された。

事故1:SQLiteデータベースの全削除(#37405)

677件のPDFをOCR処理して作った301MBのSQLite FTS5データベース。完成していた。

新しいセッションでClaude Codeが起動した。指示なし、確認なし、警告なし。full_index()を実行した。既存のデータベースを削除して、インデックスを最初から作り直した。

事故2:Laravelのmigrate:fresh(#37439)

テストデータベースのスキーマを修正しようとして、Claude Codeがphp artisan migrate:fresh --env=testingを実行した。

問題は、.env.testingファイルが存在しなかったこと。Laravelの--envフラグはファイルがなければ.envにフォールバックする。.envは本番データベースを指していた。

全データが消えた。

なぜ起きるか

Claude Codeはデータベースコマンドの危険性を「知っている」。だが知っていることと実行しないことは別。

コンテキストが長くなると、システムプロンプトの指示が薄れる。「本番DBに触るな」というCLAUDE.mdの指示は、100回目のツール呼び出しでは最初ほど効かない。

フックで防ぐ

PreToolUseフックはコンテキスト長に関係なく、毎回のツール呼び出しで実行される。

#!/bin/bash
COMMAND=$(cat | jq -r '.tool_input.command // empty' 2>/dev/null)
[[ -z "$COMMAND" ]] && exit 0

# Laravel
if echo "$COMMAND" | grep -qiE 'artisan\s+(migrate:fresh|migrate:reset|db:wipe)'; then
    echo "BLOCKED: 破壊的データベースコマンド" >&2
    exit 2
fi

# .envファイル存在チェック
if echo "$COMMAND" | grep -qE 'artisan.*--env='; then
    ENV_NAME=$(echo "$COMMAND" | sed -n 's/.*--env=\([a-zA-Z0-9_]*\).*/\1/p')
    if [ -n "$ENV_NAME" ] && [ ! -f ".env.$ENV_NAME" ]; then
        echo "BLOCKED: .env.$ENV_NAME が存在しない(.envにフォールバックする)" >&2
        exit 2
    fi
fi

# Django
if echo "$COMMAND" | grep -qiE 'manage\.py\s+(flush|sqlflush)'; then
    echo "BLOCKED: 破壊的データベースコマンド" >&2
    exit 2
fi

# 生SQL
if echo "$COMMAND" | grep -qiE 'DROP\s+(DATABASE|TABLE)|TRUNCATE'; then
    echo "BLOCKED: 破壊的SQL" >&2
    exit 2
fi
exit 0

exit code 2は絶対ブロック。Claudeは上書きできない。

設定

{
  "hooks": {
    "PreToolUse": [{
      "matcher": "Bash",
      "hooks": [{ "type": "command", "command": "~/.claude/hooks/block-database-wipe.sh" }]
    }]
  }
}

教訓

CLAUDE.mdに「データベースを消すな」と書いても、コンテキストが長くなれば無視される。フックは無視されない。

ルールを書くな。フックを書け。


🛡 npx cc-safe-setup — 667の安全フック + 9,200+のテストを10秒でインストール


📖 トークン消費に困っているならClaude Codeのトークン消費を半分にする——800時間の運用データから見つけた実践テクニック(¥2,500・はじめに+第1章 無料)


⚠ Opus 4.7緊急情報(2026年4月)
auto modeの安全分類器がOpus 4.6にハードコードされており、Opus 4.7では正常に機能しない(#49618)。hookはモデル非依存で動作するため、分類器の故障に関係なく防御が機能する。→ Opus 4.7 Survival Guide / Safety Scanner

📖 AIで事業を回す実体験を全記録Claude Code×個人事業 800時間の全記録(¥800・第2章まで無料)


⚠️ 新CVE公開(2026年4月): CVE-2026-21852でプロジェクト内の.claude/settings.jsonからAPIキーが窃盗される脆弱性が判明。npx cc-safe-setupはユーザーレベル設定のみを使用するため、この攻撃に免疫がある。詳細: Opus 4.7 Survival Guide(48問題追跡中)

📚 関連商品 (2026 年 5 月 22 日発売): 本記事の「データベースを消した 2 件」 の系統の継続として、 利用者の集まりが観察した 27 件の同型の事例 (主張と実態の乖離 + 信頼の境界の崩壊) と 14 件の防衛の手順を整理した Claim-Verify Handbook (Gumroad、 19 米ドル、 同日発売)、 そして留まる + 切り替えるの 8 gate / 13 leaf の判定の樹を含む Migration Playbook 第 2 版 (Gumroad、 19 米ドル、 第 1 版の購入者は無償の更新)。


📚 関連の参考資料 (2026年5月28日追加)

本記事の内容と関連する整理を、 公開済の素材で articulate しています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?