SAMPLE REPORT — 様式見本
リリース前に対応を推奨する項目(架空例・優先順)
※本サマリーは「発見された問題の重大度と対応の優先順位」を示すものであり、リリース可否を保証するものではありません(本ページの数値・件数は説明用の架空例です)。
実際の報告書では、発見した指摘すべてをこの形式(重大度・再現手順・該当箇所・修正提案)で記載します。以下はフォーマットを示すための架空例です。
契約詳細の取得APIにテナント(管理会社)の検証がなく、リクエスト中の契約IDを別テナントのものに書き換えると、他社の契約情報が取得できてしまう、という架空の想定です。
contractId を、管理会社Bが所有する契約IDに書き換えるGET /api/contracts/:id のハンドラ — 所属テナントの検証なし
// 架空のサンプルコードです(実在のコードではありません)
export async function GET(req, { params }) {
const contract = await db.contract.findUnique({
where: { id: params.id },
});
return NextResponse.json(contract);
}
// 修正案(架空のサンプルコードです)
export async function GET(req, { params }) {
const tenantId = await getTenantIdFromSession(req);
const contract = await db.contract.findFirst({
where: { id: params.id, tenantId },
});
if (!contract) {
return NextResponse.json({ error: "Not Found" }, { status: 404 });
}
return NextResponse.json(contract);
}
外部決済APIのキーが、クライアント側に露出する環境変数(NEXT_PUBLIC_ 接頭辞)で管理されており、ビルド後のJSバンドルに平文で含まれてしまう、という架空の想定です。
環境変数定義
// .env(架空のサンプルです)
NEXT_PUBLIC_PAYMENT_API_KEY=sk_live_xxxxxxxxxxxxxxxx
クライアントコンポーネントでの参照
// 架空のサンプルコードです
const key = process.env.NEXT_PUBLIC_PAYMENT_API_KEY;
fetch("https://payment.example.com/charge", {
headers: { Authorization: `Bearer ${key}` },
});
// 修正案(架空のサンプルです)
// .env: PAYMENT_API_KEY=sk_live_xxxx (NEXT_PUBLIC_ を外し、サーバー専用にする)
// app/api/charge/route.ts — サーバー側のみでキーを参照
export async function POST(req) {
const key = process.env.PAYMENT_API_KEY; // サーバー環境変数
// ここで決済APIを呼び出す。クライアントは /api/charge を叩くのみ
}
部屋検索APIの検索パラメータにバリデーションがなく、不正な値を渡した際のエラーで、内部のスタックトレースがそのままレスポンスに露出してしまう、という架空の想定です。
// 架空のサンプルコードです
app.get("/api/units/search", async (req, res) => {
const rooms = await db.query(
`SELECT * FROM units WHERE floor = ${req.query.floor}`
);
res.json(rooms);
});
// 修正案(架空のサンプルです)
app.get("/api/units/search", async (req, res) => {
const parsed = z.coerce.number().int().safeParse(req.query.floor);
if (!parsed.success) {
return res.status(400).json({ error: "invalid parameter" });
}
try {
const rooms = await db.unit.findMany({ where: { floor: parsed.data } });
res.json(rooms);
} catch (e) {
logger.error(e); // スタックトレースはログのみに出力し、レスポンスには含めない
res.status(500).json({ error: "internal error" });
}
});
残りの指摘(High×1・Medium×2・Low×4)についても、実際の報告書では同一フォーマットで全件記載します。
「本サンプルでの扱い」列は、この見本ページ内でどこまで例示したかを示すものです(実際のレビューでは全項目を本文と同水準で記載します)。
| # | 観点 | 本サンプルでの扱い |
|---|---|---|
| ① | 認証・認可(テナント分離・権限境界・IDOR) | 確認済み |
| ② | 入力検証・インジェクション | 確認済み |
| ③ | 秘密情報・鍵管理 | 確認済み |
| ④ | 個人情報の取り扱い | 所見のみ |
| ⑤ | エラー処理・ログ | 所見のみ |
| ⑥ | 依存パッケージ脆弱性 | 対象外 |
| ⑦ | コード品質・保守性 | 所見のみ |
| ⑧ | 性能・データ量耐性 | 対象外 |
| ⑨ | バックアップ・復旧 | 対象外 |
| ⑩ | リリース運用(環境分離・ロールバック) | 対象外 |