Claude Codeのセキュリティチェックリストで、認証・認可・入力検証・シークレット管理・注入面を短時間で具体的にスポットチェックしましょう。

軽量なセキュリティ・スポットチェックは、出荷前に明らかで影響の大きい問題を素早く見つけるための短時間レビュー(通常30~60分)です。完全な監査ではありません。安全点検のように、実装で最も失敗しがちな箇所をざっと確認し、推測ではなく証拠を探します。
このClaude Codeセキュリティチェックリストは、日常のウェブアプリで最も壊れやすい領域に焦点を当てます:
バグの不存在を証明したり、高度な脅威モデルを扱ったり、ペネトレーションテストの代わりをするものではありません。
「具体的な所見」とは、記録する問題のすべてに開発者が直ちに対応できる証拠があることを意味します。各所見については次を記録してください:
AIは補助ツールであり、最終判定者ではありません。検索、要約、テスト案の提案に使い、その後コードを読み、可能なら実際のリクエストで再現して検証してください。モデルが具体的な場所と手順を示せない場合は、その主張は未検証として扱ってください。
短時間レビューが機能するには対象を絞ることが必要です。Claude Codeに見てもらう前に、今日何を証明したいか、何をチェックしないかを決めてください。
まず、ミスが金銭被害、データ漏洩、権限付与につながる実際のユーザージャーニーを1~3個選びます。ログイン、パスワードリセット、チェックアウト、管理者編集画面などが良い候補です。
次に保護すべき資産を具体的に書き出します:ユーザーアカウント、決済操作、個人データ、管理者のみの操作など。
その後、守るべき脅威の前提を平易に書きます。好奇心でクリックするユーザーなのか、スクリプトを持つ外部攻撃者なのか、ある程度のアクセスを持つ内部者なのかで、「十分」と見なす基準が変わります。
最後に、合格/不合格の基準を定義して、スポットチェックが感覚ではなく所見で終わるようにします。シンプルなルールが有効です:
失敗の具体像が説明できないなら、範囲がまだ曖昧です。
スポットチェックはモデルが正しい箇所を見ているときだけ有効です。レビューが推測ではなく証拠を出せるよう、小さなコードとメモの束を用意してください。
セキュリティ上重要なパス、つまりリクエストの入口と誰がユーザーかを決めるコードを共有し、データがどのように流れるかが分かるだけの周辺コードも含めます。
実用的なバンドル例:
セッションかJWTか、トークンはクッキーかヘッダか、リバースプロキシやAPIゲートウェイの挙動、キュー/cronワーカー、内部専用のエンドポイントなど、前提を明確にするため数行の環境メモも追加してください。
バグを追う前に、エントリポイント、特権エンドポイント、触れるデータストアのインベントリを求めてください。これで見落としを防げます。
また、具体的な所見を出させる出力形式を合意しておくと良いです。シンプルな表:所見、重大度、影響を受けるエンドポイント/ファイル、証拠(正確なスニペットか行範囲)、悪用シナリオ、修正案、などが有効です。
時間配分:
目的は完璧な網羅ではなく、テスト可能な少数の所見を出すことです。
アプリを開いた状態でコードを読み、UIを操作して発生するリクエストを観察します。ノートは具体的なエンドポイント、パラメータ、データソースを指すべきです。
一回の作業で完了するワークフロー例:
役立つ習慣:"問題なさそう" と判断したら、それを壊す方法を必ず書く。壊し方を説明できなければ、十分に検証していない可能性が高いです。
認証は「このリクエストはこの人に属する」と決める箇所です。短時間のスポットチェックは全行を読むことではなく、本人性が確立される場所を見つけ、ショートカットや失敗パスを確認することにあります。
信頼境界を特定してください:どこで本人性が初めて作られたり受け入れられたりするか。セッションクッキー、JWTベアラートークン、APIキー、エッジでのmTLSなどがあります。Claude Codeに「anonymousをユーザーIDに変える正確なファイルと関数を示して」と依頼し、同等の別の経路がないかも列挙させてください。
注視すべき点:
実用例:リセットメールが「アカウントが見つかりません」と返すのは列挙の問題ですが、応答時間差でも同じ事実が漏れることがあるので、タイミングもチェックしてください。
認可の誤りは最も被害が大きくなりがちです。「このユーザーはこの操作をこのリソースで行って良いか?」が正しく判断されているかを壊す目的でテストします。
ロールと権限を平易な言葉で書き出してください。例:
その上で、あらゆる機密操作がサーバー側で認可を強制しているか確認してください。UIでボタンを隠すだけでは不十分で、攻撃者はAPIを直接叩けます。
よく見つかる問題点:
典型的なIDORの匂いは単純です:GET /projects/{id} のように {id} がユーザー管理下にあり、サーバーがそれが現在のユーザーに属するかを検証せずに読み込んでいる場合。
実地的なプロンプト例:
「このエンドポイントでアクセスを決定する正確なコードを示し、別のorgIdのユーザーがアクセスできてしまう具体的な条件を列挙してください。該当がなければ、ファイルと関数名でその理由を説明してください。」
多くのウェブアプリの問題は、アプリが想定していない入力を受け入れてしまうことから始まります。ここでいう「入力」は、ユーザーや他システムが影響を与えうるあらゆるものです。
まず、スポットチェック対象のエンドポイントの入力を列挙しましょう:
検証はデータがアプリに入る境界近くで行うべきで、ビジネスロジックの奥深くではなく入口付近を見てください。基本を確認:型(文字列か数値か)、最大長、必須か任意か、形式(メール、UUID、日付)など。
ロールやステータス、ソート方向のように既知の値はホワイトリスト方式にするのが望ましいです。いくつかの悪い値をブロックするより安全です。
またエラー処理をチェックしてください。入力を拒否する際に、生の値をレスポンスやログ、UIにそのまま返すのは避けるべきです。小さな検証ミスがデータ漏洩や注入の助けになります。
危険なエンドポイント(ログイン、検索、アップロード、管理者操作)に対する簡単なテストプラン:
例:任意の文字列を受け取るソートパラメータは後でSQL断片になる可能性があります。"date"や"price"のような許可リストにするとこのクラスのミスを予防できます。
短時間レビューで見つかる問題はだいたい同じ場所にあります:ユーザー入力がコード、クエリ、パス、URLとして解釈される箇所を探します。ここでは「入力が信頼境界を越える」瞬間を狩ります。
エントリポイント(クエリ、ヘッダ、クッキー、アップロード、管理フォーム)から、入力がどこに届くかをトレースしてください。
以下のパターンを探し、各々について具体的な呼び出し箇所とペイロード例を求めてください:
ORDER BY、IN (...)を結合して作るビルダデシリアライズやテンプレート注入にも気をつけてください。ユーザー提供のJSON、YAML、テンプレート化された文字列を解析する機能は、カスタム型や式をサポートしていると特に危険です。
機能がURL、ファイル名、整形テキストを受け入れるなら、コードパスとテストで証明できるまで悪用可能だと仮定してください。
シークレットの問題は探す場所が分かれば分かりやすいことが多いです。シークレットがどこに存在し、どこで誤ってコピーされうるかに注目しましょう。
シークレットが現れやすい場所:
次に、もしシークレットが露出していたら何が起きるかを具体的に問います。良い設計はローテーション手順(新しいキー発行)、取り消し(旧キー無効化)、再デプロイの迅速さがあることです。「後で変える」としか答えられないなら所見にしてください。
最小権限も重要な改善点です。キーに過剰な権限があるとインシデントの影響が大きくなります。データベースユーザーがテーブルをDROPできる、サードパーティトークンがアカウントを管理できる、環境を跨いでキーが共有される、などを探してください。サービスごと・環境ごとに鍵を分け、必要最小限の権限を与えましょう。
短時間のチェックで使えるプロンプト例:
最後に、ガードレールを確認します:シークレットをソース管理から排除する(pre-commit/CIチェック)、バックアップやスナップショットに平文の資格情報が含まれないことを確認する。プラットフォームがスナップショットとロールバックをサポートするなら、シークレットは実行時に注入され、保存イメージに焼き込まれていないことを確かめてください。
あいまいなプロンプトはあいまいな回答を呼びます。モデルに証拠を提示させるには、正確な場所、たどれるトレース、実行可能な再現手順、誤りを示す条件を求めます。
一度に一つのパターンを使い、修正が必要なら出力を更新させてください。
出力がまだあいまいなら、次でピンポイントに指示します:
"file path, function name, risky line, and one-sentence impact のみで答えてください。"
プロフィール更新エンドポイントは所有権ミスを隠しがちです。ここでチェックリストを通して検討できる小さなケースを示します。
シナリオ:APIがユーザープロフィールを更新する場合:
PATCH /api/profile?accountId=123 に { "displayName": "Sam" } のようなJSONを送るとします。
Claude Codeにハンドラを見つけさせ、accountId の使われ方を追跡し、サーバーが所有権を強制しているか証明してもらいます。
よく見つかる結果:
accountIdを信頼しており、ログイン済みユーザーと照合せずに同アカウントを更新してしまう。displayNameはトリムされるが、accountIdは整数として検証されていない。"... WHERE account_id=" + accountId。良い報告は具体的です:
accountIdを書き換えて変更できる。SQLが未検証の入力で組み立てられている。accountIdを無視し、サーバー側で認証されたユーザーのアカウントIDを使う。クエリはパラメータ化する。accountIdを拒否する。修正後の素早い再チェック:
accountIdで同じリクエストを送り失敗することを確認する。UIが強制しているように見えることを信用するのは最速で脆弱性を見逃す方法です。ボタンを隠しているだけでは権限チェックではありません。サーバーがリクエストを受け入れているなら、誰でもリプレイできます。
もう一つの落とし穴はあいまいな依頼です。「セキュリティレビューをして」に対しては総論的なレポートが返るだけです。スポットチェックは範囲(どのエンドポイント、どのロール、どのデータ)が狭く、出力形式(ファイル名、関数、危険行、最小再現)を厳格にする必要があります。
AI出力にも同じルールを適用してください:所見に具体的なコード位置と手順がないなら未検証として扱います。
よくある失敗:
もしフィルタを増やしてばかりいるなら一旦止まりましょう。修正は多くの場合、境界での検証と認可チェックを早い段階で明示的かつ集中させることです。
これらは完全なレビューの代わりにはなりませんが、疲れているときに紛れ込むミスを見つけます。すぐに証明できるものに集中してください:送れるリクエスト、開けるページ、見つけられるログ行など。
通常効果がある5つの短いスポットチェック:
今週中に出せるトップ3の修正を書き出してください。願望リストではなく実際に出せるもの:例(1)ログインとパスワードリセットにレート制限を追加、(2)"idで取得"エンドポイントにサーバー側の所有権チェックを強制、(3)検索フィールドの入力長を上限し予期外文字を拒否。
スポットチェックは所見が出ても、それが出荷に反映されなければ意味がありません。チェックリストを小さく繰り返し実行可能なビルドステップにしてください。
各所見を分かりやすいバックログ項目に変換します:
リスクとチーム規模に合わせた頻度を選んでください。多くのチームはリリースごとが理想です。頻繁にリリースする場合は月次で30~60分のレビュー、出荷前に短いチェックを入れると良いでしょう。
繰り返しやすくするために、再利用可能なプロンプトパックとチェックリストテンプレートを作ってください。プロンプトはルート、ガード、失敗リクエスト、期待挙動を示す具体的な出力に絞ります。チームが普段使う場所にパックを保管しておくとスキップされにくくなります。
チャットでアプリを作るなら、設計段階でチェックリストを組み込みます。認証・認可・入力・シークレットに関する短い「セキュリティ前提」メモを付け、最初のワーキングバージョンの直後にスポットチェックを実行してください。
Platforms like Koder.ai (koder.ai) は、迅速に繰り返し作業しつつレビューのチェックポイントを維持するのに適しています。スナップショットとロールバックをリスクのある変更に対して使えると、セキュリティ修正を出荷しやすくなります。