コード監査:[プロジェクト名]
[角括弧]内をすべて書き換えてください。証拠を自分の目で確認したときだけチェックを入れます。不合格の項目は最後のログに番号付きの指摘として記録し、重大度が致命的・高の未解決指摘がなく、プロダクトが公開されている場合にのみ監査は合格です。
01対象範囲
何を監査するのかを正確に固定します。特定のコミットを決めずに「アプリ」を監査しても、再現できません。
- リポジトリ: [URL]
- コミットまたはタグ: [SHAまたはリリースタグ]
- 合意したスコープ: [照合するPRDの版、またはベースライン番号]
- 環境: [本番URL、ストアのビルド、またはステージング]
- 監査者と日付: [氏名]、[日付]
02要件カバレッジ
作ったものは合意した内容と一致しているか。凍結したスコープに照らして、要件を一つずつ確認します。
- Mustの要件すべてに受け入れ基準がある
- Mustの要件すべてに、それを指す完了済みの作業がある
- 受け入れ基準の確認が、稼働中のプロダクトですべて通る
- 承認後に変更された要件が、旧文言と新文言とともに明示されている
- 承認後に取り下げた要件は、削除ではなく判断として記録されている
- コミットとプルリクエストが要件キーを参照している
03アクセス制御
小さなプロダクトの重大な指摘の多くはここにあります。画面を眺めるのではなく、IDを書き換えたりセッションを外したりして試します。
- 非公開データを読み書きするルートはすべてセッションを確認している
- 管理操作はログインの有無だけでなく、ロールや権限を確認している
- URLやリクエストのIDを変えても、他のアカウントのデータに届かない
- APIトークンは権限が絞られ、失効させると即座に反映される
- パスワード再設定、招待、ログイン用リンクは期限付きで一度しか使えない
04シークレットと設定
現在の状態だけでなく履歴も確認します。後のコミットで消したキーも、公開済みであることに変わりはありません。
- リポジトリにも履歴にも、キー、トークン、パスワードが含まれていない
- 環境変数ファイルはバージョン管理から除外されている
- 公開用の環境変数を通じて、サーバーのシークレットがブラウザに渡っていない
- 本番と開発で異なる認証情報を使っている
- 漏えい・共有された認証情報はローテーション済み
05依存関係
npm auditやOSVなどの脆弱性データベースを使い、アドバイザリIDを記録します。記憶に頼らないでください。
- 既知のアドバイザリを確認し、見つかったもののIDを記録した
- ロックファイルがコミットされ、ビルドで使われている
- メンテナンスされていないパッケージを記録した
- 新しい依存関係のインストールスクリプトを確認した
06入力処理
ユーザーが送れるものはすべて信頼できないものとして扱います。ヘッダー、ファイル名、Webhookの本文も含みます。
- データベースクエリはパラメータ化され、文字列連結で組み立てていない
- ユーザー入力に対してevalや動的なコード実行をしていない
- ユーザーのコンテンツは表示前にエスケープしている
- アップロードは種類とサイズを検証し、Webルートの外に保存している
- ユーザーが指定したURLへのサーバー側リクエストは制限されている
- 公開フォームにレート制限や不正対策がある
07お金の流れ
ここにあるものは何より優先します。二重請求や二重付与のバグは、公開されている間ずっとお金を失い続けます。
- 決済・注文処理は冪等で、再試行しても二重に請求されない
- Webhookの署名を検証してから内容を信頼している
- 価格と金額はサーバー側で計算し、クライアントの値を使っていない
- 返金、クレジット、クーポンは同時リクエストでも二重に使えない
08信頼性と運用
悪い日に何が起きるか、そして誰かがそれに気づけるか。
- エラーは、誰かが実際に見ている監視ツールに送られている
- バックアップがあり、実際に復元を試したことがある
- マイグレーションは、それに依存するコードのリリース前に適用している
- 定期ジョブは二重に実行されても問題ない
09公開されている
チーム外の誰も触れられないものの監査は、まだ終わっていません。
- デプロイ済みで、社外の人がアクセスできる
- 本番URLまたはストアの掲載ページを記録した
- 登録と主要な流れが、ローカルだけでなく本番で動く
10指摘事項ログ
不合格のチェック1つにつき1行。お金やデータに関わるものから順に並べます。証拠のない指摘は意見にすぎません。外すか、証拠を取りに行きましょう。
重大度: 致命的、高、中、低、情報
| ID | 重大度 | 場所 | 証拠 | 再現手順 | 修正案 | 状態 |
|---|---|---|---|---|---|---|
| F-001 | [致命的] | [path/file.ts:42] | [問題を示すもの] | [手順] | [行う変更] | 未対応 |
| F-002 | [高] | [ルートまたはファイル] | [問題を示すもの] | [手順] | [行う変更] | 未対応 |
11判定
合格か、もう一度イテレーションか。部分合格はありません。
- 結果: [合格 / 再イテレーション]
- 未解決の指摘: [重大度別の件数]
- フォローアップ: [修正を管理する場所]
- 次回の監査: [日付またはきっかけ]