卒業クイズ:SQLインジェクション攻撃を阻止しよう
クイズの説明
今月の全範囲をカバーする最終クイズです。
- 全15問
- 合格ライン: 80%(12問正解)
- 合格するとセキュリティ基礎修了証明書を取得できます
問題
Q1. OWASP Top 10(2021年版)の1位はどれですか?
- A) インジェクション
- B) アクセス制御の不備
- C) 暗号化の失敗
- D) セキュリティの設定ミス
正解: B
2021年版では「アクセス制御の不備」が1位です。 インジェクションは以前は1位でしたが、3位に移動しました。
</details>Q2. 以下のSQLインジェクション攻撃の種類はどれですか?
' AND IF(SUBSTRING((SELECT password FROM users LIMIT 1), 1, 1) = 'a', SLEEP(5), 0) --- A) クラシックSQLインジェクション
- B) Boolean-based ブラインドSQLインジェクション
- C) Time-based ブラインドSQLインジェクション
- D) エラーベースSQLインジェクション
正解: C
SLEEP(5) を使用して応答時間の差からデータを推測するため、
Time-based ブラインドSQLインジェクションです。
条件が真の場合に5秒の遅延が発生し、偽の場合は即座に応答するため、 レスポンス時間を測定することで1文字ずつ情報を抽出できます。
</details>Q3. 格納型XSSが最も危険とされる理由はどれですか?
- A) サーバーのログに記録されないから
- B) 攻撃コードがDBに保存され、ページを見る全ユーザーが被害を受けるから
- C) 防御方法が存在しないから
- D) ブラウザのセキュリティ機能を無効化するから
正解: B
格納型XSSでは悪意のあるスクリプトがデータベースに保存され、 そのデータを表示するページにアクセスする全てのユーザーのブラウザで実行されます。 攻撃者がURLを配布する必要がなく、影響範囲が広いため最も危険です。
</details>Q4. CSRFトークンの仕組みとして正しいものはどれですか?
- A) パスワードを暗号化してCookieに保存する
- B) フォームに推測不可能なトークンを埋め込み、サーバーで検証する
- C) HTTPSでの通信を強制する
- D) ユーザーのIPアドレスを記録する
正解: B
CSRFトークンは、フォームにランダムな値を隠しフィールドとして埋め込み、 フォーム送信時にサーバー側でそのトークンを検証する仕組みです。 攻撃者は正規のフォームに含ま れるトークンの値を知ることができないため、 罠サイトからの偽リクエストはトークン検証で拒否されます。
</details>Q5. パラメータ化クエリで防げない攻撃はどれですか?
- A) UNION SELECT を使ったデータ窃取
- B) ' OR 1=1 -- を使った認証バイパス
- C) ORDER BY句へのインジェクション
- D) '; DROP TABLE users -- を使ったテーブル削除
正解: C
ORDER BY句にはパラメータを使用できません(カラム名はデータではなく構文の一部)。 そのため、ORDER BY句への入力はホワイトリスト方式で検証する必要があります。
A、B、DはいずれもWHERE句やINSERT文のパラメータであり、 パラメータ化クエリで防ぐことができます。
</details>Q6. bcrypt の特徴として正しいものはどれですか?
- A) 高速なハッシュ計算が可能
- B) ソルトを自動生成し、意図的に低速に設計されている
- C) SHA-256の改良版である
- D) 暗号化アルゴリズムで、復号が可能
正解: B
bcryptはパスワードハッシュ用に設計されたアルゴリズムで、 ソルトを自動的に生成し、コスト係数により意図的に計算を低速にします。 これにより、ブルートフォース攻撃やレインボーテーブル攻撃への耐性があります。
</details>Q7. JWTのペイロードに含めてはいけない情報はどれですか?
- A) ユーザーID
- B) ユーザーのロール
- C) パスワードのハッシュ
- D) トークンの有効期限
正解: C
JWTのペイロードはBase64Urlでエンコードされているだけで暗号化されていません。 誰でもデコードして中身を読むことができるため、パスワードのハッシュなどの 機密情報を含めてはいけません。
ユーザーID、ロール、有効期限は一般的にペイロードに含めます。
</details>Q8. OAuth 2.0の認可コードフローで、client_secretを使用するのはどこですか?
- A) ブラウザ(フロントエンド )
- B) サーバーサイド(バックエンド)
- C) 認可サーバー
- D) リソースサーバー
正解: B
client_secretは認可コードをアクセストークンに交換する際に使用しますが、 この処理は必ずサーバーサイドで行う必要があります。 client_secretがブラウザに公開されると、攻撃者がアプリケーションになりすませます。
</details>Q9. Content-Security-Policy の script-src 'self' が防ぐ攻撃はどれですか?
- A) SQLインジェクション
- B) XSSによるインラインスクリプトの実行
- C) CSRF
- D) ブルートフォース攻撃
正解: B
script-src 'self' は同一オリジンからのスクリプトファイルのみ実行を許可します。
XSSで注入されたインラインスクリプト(<script>alert(1)</script>)は
'self' に含まれないため、ブラウザが実行をブロックします。
Q10. Cookie の SameSite=Strict 属性が防ぐ攻撃はどれですか?
- A) SQLインジェクション
- B) XSS
- C) CSRF
- D) ブルートフォース攻撃
正解: C
SameSite=Strict はクロスサイトリクエストでCookieを一切送信しないため、
罠サイトからの偽リクエストにCookieが付与されず、CSRF攻撃を防止できます。
Q11. SAST と DAST の組み合わせとして最も効果的なタイミングはどれですか?
- A) SASTは本番環境、DASTは開発環境で実行
- B) SASTは開発中/PR作成時、DASTはテスト環境で実行
- C) SASTとDASTの両方を本番環境で実行
- D) SASTのみで十分、DASTは不要
正解: B
- SAST: ソースコードの静的分析。開発中やPR作成時に実行し、問題を早期発見
- DAST: 実行中のアプリケーションのテスト。テスト環境やステージング環境で実行
両方を組み合わせることで、コードの問題(SAST)と設定・実行時の問題(DAST)の 両方をカバーできます。
</details>Q12. npm audit が検出するものはどれですか?
- A) 自分が書いたコードの脆弱性
- B) 依存パッケージの既知の脆弱性(CVE)
- C) テストのカバレッジ不足
- D) コードのフォーマット違反
正解: B
npm audit は、node_modules にインストールされている依存パッケージに
既知のセキュリティ脆弱性(CVE)がないかをチェックするツールです。
自分が書いたコードの脆弱性は検出しま せん(それはSASTの役割です)。
</details>Q13. 以下のコードの最も深刻な問題はどれですか?
app.delete('/api/users/:id', async (req, res) => {
await pool.query(`DELETE FROM users WHERE id = ${req.params.id}`);
res.json({ deleted: true });
});- A) HTTPメソッドがDELETEである
- B) レスポンスのJSONフォーマットが不適切
- C) 認証・認可チェックがなく、SQLインジェクションの脆弱性がある
- D) async/awaitの使い方が間違っている
正解: C
このコードには2つの深刻な問題があります:
- 認証・認可チェックなし: 誰でもユーザーを削除できる
- SQLインジェクション:
req.params.idを直接SQL文に埋め込んでいる。1 OR 1=1で全ユーザーが削除される
Q14. Dependabot が自動作成するものはどれですか?
- A) テストコード
- B) セキュリティレポート
- C) 依存パッケージを更新するPull Request
- D) デプロイスクリプト
正解: C
Dependabotは依存パッケージの新バージョン(特にセキュリティ修正)を検出し、 バージョンを更新するPull Requestを自動的に作成します。
開発者はPRをレビューし、CIテストが通ればマージするだけです。
</details>Q15. 多層防御(Defense in Depth)の考え方として正しいものはどれですか?
- A) 1つの強力な防御で全ての攻撃を防ぐ
- B) 複数の防御レイヤーを 組み合わせ、1つが突破されても次で食い止める
- C) 最も重要な部分だけを防御する
- D) 攻撃を受けてから対処する
正解: B
多層防御は、ファイアウォール、WAF、入力バリデーション、パラメータ化クエリ、 出力エスケープ、CSP、セキュリティヘッダーなど、複数の防御レイヤーを組み合わせる考え方です。
1つの防御が突破されても、次のレイヤーで攻撃を食い止められます。 「完璧な1つの防御」は存在しないため、複数の対策を重ねることが重要です。
</details>結果
12問以上正解の場合
合格です。おめでとうございます。
╔══════════════════════════════════════════╗
║ ║
║ セキュリティ基礎 修了証明書 ║
║ ║
║ 以下のスキルを習得したことを証明します ║
║ ║
║ - OWASP Top 10 の理解 ║
║ - セキュアコーディング ║
║ (SQLi対策, XSS対策, 入力検証) ║
║ - JWT / OAuth 2.0 認証・認可 ║
║ - DevSecOps ║
║ (SAST/DAST/SCA, CI/CD統合) ║
║ ║
║ L1 Month 4 完了 ║
║ ║
╚══════════════════════════════════════════╝
11問以下の場合
もう少し復習しましょう。
| 問題 | 復習セクション |
|---|---|
| Q1, Q2, Q3, Q4 | Step 1: 攻撃の仕組み |
| Q5, Q13 | Step 2-3: 脆弱性特定とセキュア実装 |
| Q6, Q7, Q8, Q10 | Step 4: OAuth/JWT |
| Q9, Q15 | Step 3: セキュリティヘッダー |
| Q11, Q12, Q14 | Step 5: DevSecOps |
ミッション完了
お疲れさまでした。「SQLインジェクション攻撃を阻止しよう」ミッションを完了しました。
今月で身につけたスキル
| スキル | 内容 |
|---|---|
| セキュアコーディング | パラメータ化クエリ、入力バリデーション、出力エスケープ |
| 認証・認可 | JWT、OAuth 2.0、RBAC、bcrypt |
| DevSecOps | SAST/DAST/SCA、CI/CDパイプライン、Dependabot |
| セキュリティ知識 | OWASP Top 10、攻撃手法、多層防御 |
高橋さんからのメッセージ
「よくやっ た。これで基本的なセキュリティの知識と実践力が身についた。 でもセキュリティの学びに終わりはない。新しい攻撃手法は常に生まれている。 大切なのは、セキュリティを意識する姿勢を維持し続けることだ。 コードを書くとき、レビューするとき、常に攻撃者の視点を忘れないでくれ」
推定所要時間: 30分