はじめに
Claude Codeの開発速度は凄まじい。CLAUDE.mdを整備してSkillsを組めば、1日で動くプロダクトが出来上がる。
でも、ふと気づいた。「動く」と「安全」は別物だということに。
私は2週間前、自分がClaude Codeで生成したコードをセキュリティスキャンにかけてみた。結果、テストが全部通っているコードから複数の脆弱性パターンが検出された。
この記事では、AI生成コードのセキュリティチェックを3分で終わらせる方法を紹介する。
なぜAI生成コードのセキュリティチェックが必要なのか
先日、AI評価機関METRが興味深い調査結果を発表した。
SWE-benchのテストに合格したPRでも、人間のレビュアーはマージを拒否する
テストが通る。アプリも動く。でもコードとしてはマージできない品質 — その中にセキュリティの問題が含まれている。
私が実際にAI生成コードをスキャンして頻繁に見つけたパターンがこれだ:
パターン1: シークレットのハードコード
// Claude Codeが「とりあえず動くように」生成しがち
const API_KEY = "sk-proj-abc123...";
.envに分離すべきなのは分かっている。でもAIは「動くコード」を最優先で生成するので、ハードコードされたまま出てくることがある。特にプロトタイプや検証コードで頻出する。
パターン2: 過剰に寛容なCORS
// 開発環境では問題ないが本番ではNG
app.use(cors({ origin: '*' }));
Claude Codeに「APIを作って」と指示すると、高確率でこのパターンが出てくる。開発中は問題ないので気づきにくい。
パターン3: 入力値の未検証
// ユーザー入力をそのまま使用
const userId = req.params.id;
const result = await db.query(`SELECT * FROM users WHERE id = ${userId}`);
テストでは正常値しか渡さないので通る。本番で悪意あるリクエストが来たら終わり。
パターン4: eval / Function の使用
// 「動的にコードを実行したい」というプロンプトに対してAIが生成
const result = eval(userInput);
AIに「柔軟な処理」を求めると、evalやnew Function()が出てくることがある。テストは通る。でもこれは任意コード実行の脆弱性だ。
3分でチェックする手順
Step 1: コードをコピー(30秒)
Claude Codeが生成したコード — 例えばAPIルート、コンポーネント、ユーティリティ関数など — をコピーする。
ファイル単位でもいいし、気になる部分だけでもいい。
Step 2: スキャンを実行(30秒)
CodeHealにアクセスして、コードを貼り付け。言語を選択して「Scan」ボタンを押す。
スキャンは数秒で完了する。LLMを使わない純粋な静的解析なので、待ち時間はほぼゼロ。
Step 3: 結果を確認して対処(2分)
スキャン結果には以下が表示される:
- リスクスコア: 0-100のスコア。高いほど危険
- 検出された脆弱性: カテゴリ別に分類
- 該当箇所: コードのどの部分が問題か
- 深刻度: Critical / High / Medium / Low
Criticalが出たら即修正。Highは本番デプロイ前に対処。Medium以下は時間があるときに。
実際にスキャンしてみた結果
私が開発中のSaaSプロジェクトで、Claude Codeが生成したコードをスキャンした実例を紹介する。
ケース1: Express APIサーバー
Claude Codeに「Express + PostgreSQLのCRUD APIを作って」と指示して生成されたコード。
検出結果:
-
cors({ origin: '*' })→ CORS設定の脆弱性 - テンプレートリテラルでのSQL構築 → SQLインジェクションリスク
-
process.env.DB_PASSWORDのフォールバックにハードコード値 → シークレット漏洩
テストは全部通っていた。でもスキャナーは3つの問題を検出した。
ケース2: Next.js APIルート
「NextAuth.jsでGitHub OAuthを設定して」と指示したコード。
検出結果:
-
NEXTAUTH_SECRETが短すぎる文字列でハードコード → セッションハイジャックリスク - CSRF保護の設定漏れ
これもテストでは気づけない。OAuthフローは正常に動作するので。
ケース3: ファイル操作ユーティリティ
「ファイルをアップロードして保存する関数を作って」と指示したコード。
検出結果:
- パストラバーサル未対策 →
../../etc/passwdのようなパスで任意ファイル読み取り - ファイルサイズ制限なし → DoS攻撃の可能性
CLAUDE.mdにセキュリティルールを追加する
スキャンで見つかる問題をそもそも生成させないのが理想だ。CLAUDE.mdにセキュリティルールを書いておくと、Claude Codeが最初から安全なコードを生成しやすくなる。
# CLAUDE.md に追記
## セキュリティルール
- APIキー・シークレットは必ず環境変数(.env)から読み込む。ハードコード禁止
- CORSは許可するオリジンを明示的に指定する(origin: '*' 禁止)
- SQLクエリは必ずパラメータ化する。テンプレートリテラルでの直接埋め込み禁止
- ユーザー入力は信頼境界で必ずバリデーション・サニタイズする
- eval() / new Function() は使用禁止
- ファイルパスはpath.resolve + ベースディレクトリチェックでパストラバーサル対策する
これを入れてからAI生成コードの品質が明らかに変わった。ただし、CLAUDE.mdだけでは100%防げない。生成後のスキャンとの二重チェックが安全。
まとめ
| ステップ | 所要時間 | やること |
|---|---|---|
| 事前対策 | 5分(初回のみ) | CLAUDE.mdにセキュリティルールを追記 |
| Step 1 | 30秒 | コードをコピー |
| Step 2 | 30秒 | CodeHealでスキャン実行 |
| Step 3 | 2分 | 結果を確認して対処 |
開発速度を上げるTipsと、セキュリティチェックは両立できる。
Claude Codeで速く書いて、スキャンで安全を確認する。このサイクルを回すだけで、AI生成コードの品質は大きく変わる。
関連記事
- 【実践】Claude Codeの開発速度を2倍にする10のTips - まずは開発速度を上げる
- Claude Codeで半日でセキュリティスキャナーSaaSのMVPを作った話 - このスキャナーを作った経緯
- GitHubが低品質AIコードを拒否し始めた - なぜ今セキュリティが重要か
AI生成コード、スキャンしてみませんか?
CodeHealは14カテゴリ・93ルールの静的解析でAI生成コードの脆弱性を検出します。LLM不使用なので結果は毎回同じ。API費用もゼロ。