セキュリティチェックスキル
検出対象(OWASP Top 10 2024準拠)
A01: アクセス制御の不備
チェック項目:
- • すべてのエンドポイントに認証チェックがあるか
- • 認可チェック(権限確認)は適切か
- • 直接オブジェクト参照の脆弱性はないか
検出コマンド:
bash
# 認証チェックの欠如を検出 grep -rn "app\.\(get\|post\|put\|delete\)" --include="*.ts" | grep -v "auth\|middleware\|protect"
A02: 暗号化の失敗
チェック項目:
- • パスワードは適切にハッシュ化されているか(bcrypt, argon2)
- • 機密データは暗号化されているか
- • TLS/HTTPSが強制されているか
検出コマンド:
bash
# ハードコードされた機密情報 grep -rn "password\s*=\s*['\"]" --include="*.ts" --include="*.tsx" grep -rn "api_key\s*=\s*['\"]" --include="*.ts" --include="*.tsx" grep -rn "secret\s*=\s*['\"]" --include="*.ts" --include="*.tsx" grep -rn "NEXT_PUBLIC_.*SECRET" --include="*.ts" --include="*.tsx"
A03: インジェクション
チェック項目:
- • 入力値のバリデーションは十分か
- • パラメータ化クエリを使用しているか
- • コマンドインジェクション対策はされているか
検出コマンド:
bash
# SQLインジェクション候補
grep -rn "query.*\`.*\${" --include="*.ts"
grep -rn "exec.*\`.*\${" --include="*.ts"
# コマンドインジェクション候補
grep -rn "child_process\|exec\|spawn" --include="*.ts"
A07: XSS(クロスサイトスクリプティング)
チェック項目:
- • ユーザー入力はエスケープされているか
- • dangerouslySetInnerHTMLは必要最小限か
- • Content Security Policyは設定されているか
検出コマンド:
bash
# 危険なHTML挿入 grep -rn "innerHTML\s*=" --include="*.tsx" grep -rn "dangerouslySetInnerHTML" --include="*.tsx" grep -rn "__html" --include="*.tsx"
セキュアコーディングパターン
入力バリデーション(Zod使用)
typescript
// ✅ 推奨パターン
import { z } from 'zod';
const UserInputSchema = z.object({
email: z.string().email().max(255),
password: z.string().min(8).max(100),
name: z.string().min(1).max(100).regex(/^[a-zA-Z\s]+$/),
});
// 使用時
const validated = UserInputSchema.parse(req.body);
SQLインジェクション対策
typescript
// ❌ 危険
const query = `SELECT * FROM users WHERE id = ${userId}`;
// ✅ 安全(パラメータ化クエリ)
const user = await prisma.user.findUnique({ where: { id: userId } });
// ✅ 安全(prepared statement)
const [rows] = await connection.execute(
'SELECT * FROM users WHERE id = ?',
[userId]
);
XSS対策
typescript
// ❌ 危険
<div dangerouslySetInnerHTML={{ __html: userInput }} />
// ✅ 安全(サニタイズ)
import DOMPurify from 'dompurify';
<div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(userInput) }} />
// ✅ より安全(テキストとして扱う)
<div>{userInput}</div>
認証・セッション管理
typescript
// ✅ セキュアなセッション設定
const sessionOptions = {
httpOnly: true, // JavaScriptからのアクセス禁止
secure: true, // HTTPS必須
sameSite: 'strict', // CSRF対策
maxAge: 60 * 60 * 24 // 24時間で期限切れ
};
パスワードハッシュ化
typescript
// ✅ bcryptを使用 import bcrypt from 'bcrypt'; const SALT_ROUNDS = 12; // ハッシュ化 const hashedPassword = await bcrypt.hash(password, SALT_ROUNDS); // 検証 const isValid = await bcrypt.compare(password, hashedPassword);
出力フォーマット
markdown
## 🔒 セキュリティ監査結果 ### 総合判定: ✅ PASS / ⚠️ WARNING / ❌ FAIL | 重要度 | ファイル | 行 | 脆弱性タイプ | 説明 | 修正案 | |--------|---------|-----|-------------|------|--------| | 🔴 Critical | auth.ts | 42 | A02 | パスワード平文保存 | bcryptでハッシュ化 | | 🟡 High | api.ts | 15 | A03 | SQLインジェクション | Prismaクエリに変更 | | 🟠 Medium | form.tsx | 28 | A07 | XSS可能性 | DOMPurifyでサニタイズ | ### 推奨アクション 1. Critical項目を即座に修正 2. High項目を今日中に対応 3. Medium以下は次回リリースまでに対応
実行後アクション
- •Critical項目は必ず修正を提案
- •修正コードを生成し、ユーザーの承認後に適用
- •修正後、再スキャンで問題解消を確認
参考リンク
- •OWASP Top 10: https://owasp.org/Top10/
- •Node.js Security Checklist: https://cheatsheetseries.owasp.org/cheatsheets/Nodejs_Security_Cheat_Sheet.html