QUIZ 30分

卒業クイズ:SQLインジェクション攻撃を阻止しよう

クイズの説明

今月の全範囲をカバーする最終クイズです。

  • 全15問
  • 合格ライン: 80%(12問正解)
  • 合格するとセキュリティ基礎修了証明書を取得できます

問題

Q1. OWASP Top 10(2021年版)の1位はどれですか?

  • A) インジェクション
  • B) アクセス制御の不備
  • C) 暗号化の失敗
  • D) セキュリティの設定ミス
<details> <summary>答えを見る</summary>

正解: B

2021年版では「アクセス制御の不備」が1位です。 インジェクションは以前は1位でしたが、3位に移動しました。

</details>

Q2. 以下のSQLインジェクション攻撃の種類はどれですか?

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インジェクション
<details> <summary>答えを見る</summary>

正解: C

SLEEP(5) を使用して応答時間の差からデータを推測するため、 Time-based ブラインドSQLインジェクションです。

条件が真の場合に5秒の遅延が発生し、偽の場合は即座に応答するため、 レスポンス時間を測定することで1文字ずつ情報を抽出できます。

</details>

Q3. 格納型XSSが最も危険とされる理由はどれですか?

  • A) サーバーのログに記録されないから
  • B) 攻撃コードがDBに保存され、ページを見る全ユーザーが被害を受けるから
  • C) 防御方法が存在しないから
  • D) ブラウザのセキュリティ機能を無効化するから
<details> <summary>答えを見る</summary>

正解: B

格納型XSSでは悪意のあるスクリプトがデータベースに保存され、 そのデータを表示するページにアクセスする全てのユーザーのブラウザで実行されます。 攻撃者がURLを配布する必要がなく、影響範囲が広いため最も危険です。

</details>

Q4. CSRFトークンの仕組みとして正しいものはどれですか?

  • A) パスワードを暗号化してCookieに保存する
  • B) フォームに推測不可能なトークンを埋め込み、サーバーで検証する
  • C) HTTPSでの通信を強制する
  • D) ユーザーのIPアドレスを記録する
<details> <summary>答えを見る</summary>

正解: B

CSRFトークンは、フォームにランダムな値を隠しフィールドとして埋め込み、 フォーム送信時にサーバー側でそのトークンを検証する仕組みです。 攻撃者は正規のフォームに含まれるトークンの値を知ることができないため、 罠サイトからの偽リクエストはトークン検証で拒否されます。

</details>

Q5. パラメータ化クエリで防げない攻撃はどれですか?

  • A) UNION SELECT を使ったデータ窃取
  • B) ' OR 1=1 -- を使った認証バイパス
  • C) ORDER BY句へのインジェクション
  • D) '; DROP TABLE users -- を使ったテーブル削除
<details> <summary>答えを見る</summary>

正解: C

ORDER BY句にはパラメータを使用できません(カラム名はデータではなく構文の一部)。 そのため、ORDER BY句への入力はホワイトリスト方式で検証する必要があります。

A、B、DはいずれもWHERE句やINSERT文のパラメータであり、 パラメータ化クエリで防ぐことができます。

</details>

Q6. bcrypt の特徴として正しいものはどれですか?

  • A) 高速なハッシュ計算が可能
  • B) ソルトを自動生成し、意図的に低速に設計されている
  • C) SHA-256の改良版である
  • D) 暗号化アルゴリズムで、復号が可能
<details> <summary>答えを見る</summary>

正解: B

bcryptはパスワードハッシュ用に設計されたアルゴリズムで、 ソルトを自動的に生成し、コスト係数により意図的に計算を低速にします。 これにより、ブルートフォース攻撃やレインボーテーブル攻撃への耐性があります。

</details>

Q7. JWTのペイロードに含めてはいけない情報はどれですか?

  • A) ユーザーID
  • B) ユーザーのロール
  • C) パスワードのハッシュ
  • D) トークンの有効期限
<details> <summary>答えを見る</summary>

正解: C

JWTのペイロードはBase64Urlでエンコードされているだけで暗号化されていません。 誰でもデコードして中身を読むことができるため、パスワードのハッシュなどの 機密情報を含めてはいけません。

ユーザーID、ロール、有効期限は一般的にペイロードに含めます。

</details>

Q8. OAuth 2.0の認可コードフローで、client_secretを使用するのはどこですか?

  • A) ブラウザ(フロントエンド)
  • B) サーバーサイド(バックエンド)
  • C) 認可サーバー
  • D) リソースサーバー
<details> <summary>答えを見る</summary>

正解: B

client_secretは認可コードをアクセストークンに交換する際に使用しますが、 この処理は必ずサーバーサイドで行う必要があります。 client_secretがブラウザに公開されると、攻撃者がアプリケーションになりすませます。

</details>

Q9. Content-Security-Policy の script-src 'self' が防ぐ攻撃はどれですか?

  • A) SQLインジェクション
  • B) XSSによるインラインスクリプトの実行
  • C) CSRF
  • D) ブルートフォース攻撃
<details> <summary>答えを見る</summary>

正解: B

script-src 'self' は同一オリジンからのスクリプトファイルのみ実行を許可します。 XSSで注入されたインラインスクリプト(<script>alert(1)</script>)は 'self' に含まれないため、ブラウザが実行をブロックします。

</details>

Q10. Cookie の SameSite=Strict 属性が防ぐ攻撃はどれですか?

  • A) SQLインジェクション
  • B) XSS
  • C) CSRF
  • D) ブルートフォース攻撃
<details> <summary>答えを見る</summary>

正解: C

SameSite=Strict はクロスサイトリクエストでCookieを一切送信しないため、 罠サイトからの偽リクエストにCookieが付与されず、CSRF攻撃を防止できます。

</details>

Q11. SAST と DAST の組み合わせとして最も効果的なタイミングはどれですか?

  • A) SASTは本番環境、DASTは開発環境で実行
  • B) SASTは開発中/PR作成時、DASTはテスト環境で実行
  • C) SASTとDASTの両方を本番環境で実行
  • D) SASTのみで十分、DASTは不要
<details> <summary>答えを見る</summary>

正解: B

  • SAST: ソースコードの静的分析。開発中やPR作成時に実行し、問題を早期発見
  • DAST: 実行中のアプリケーションのテスト。テスト環境やステージング環境で実行

両方を組み合わせることで、コードの問題(SAST)と設定・実行時の問題(DAST)の 両方をカバーできます。

</details>

Q12. npm audit が検出するものはどれですか?

  • A) 自分が書いたコードの脆弱性
  • B) 依存パッケージの既知の脆弱性(CVE)
  • C) テストのカバレッジ不足
  • D) コードのフォーマット違反
<details> <summary>答えを見る</summary>

正解: B

npm audit は、node_modules にインストールされている依存パッケージに 既知のセキュリティ脆弱性(CVE)がないかをチェックするツールです。

自分が書いたコードの脆弱性は検出しません(それはSASTの役割です)。

</details>

Q13. 以下のコードの最も深刻な問題はどれですか?

typescript
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の使い方が間違っている
<details> <summary>答えを見る</summary>

正解: C

このコードには2つの深刻な問題があります:

  1. 認証・認可チェックなし: 誰でもユーザーを削除できる
  2. SQLインジェクション: req.params.id を直接SQL文に埋め込んでいる。1 OR 1=1 で全ユーザーが削除される
</details>

Q14. Dependabot が自動作成するものはどれですか?

  • A) テストコード
  • B) セキュリティレポート
  • C) 依存パッケージを更新するPull Request
  • D) デプロイスクリプト
<details> <summary>答えを見る</summary>

正解: C

Dependabotは依存パッケージの新バージョン(特にセキュリティ修正)を検出し、 バージョンを更新するPull Requestを自動的に作成します。

開発者はPRをレビューし、CIテストが通ればマージするだけです。

</details>

Q15. 多層防御(Defense in Depth)の考え方として正しいものはどれですか?

  • A) 1つの強力な防御で全ての攻撃を防ぐ
  • B) 複数の防御レイヤーを組み合わせ、1つが突破されても次で食い止める
  • C) 最も重要な部分だけを防御する
  • D) 攻撃を受けてから対処する
<details> <summary>答えを見る</summary>

正解: 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, Q4Step 1: 攻撃の仕組み
Q5, Q13Step 2-3: 脆弱性特定とセキュア実装
Q6, Q7, Q8, Q10Step 4: OAuth/JWT
Q9, Q15Step 3: セキュリティヘッダー
Q11, Q12, Q14Step 5: DevSecOps

ミッション完了

お疲れさまでした。「SQLインジェクション攻撃を阻止しよう」ミッションを完了しました。

今月で身につけたスキル

スキル内容
セキュアコーディングパラメータ化クエリ、入力バリデーション、出力エスケープ
認証・認可JWT、OAuth 2.0、RBAC、bcrypt
DevSecOpsSAST/DAST/SCA、CI/CDパイプライン、Dependabot
セキュリティ知識OWASP Top 10、攻撃手法、多層防御

高橋さんからのメッセージ

「よくやった。これで基本的なセキュリティの知識と実践力が身についた。 でもセキュリティの学びに終わりはない。新しい攻撃手法は常に生まれている。 大切なのは、セキュリティを意識する姿勢を維持し続けることだ。 コードを書くとき、レビューするとき、常に攻撃者の視点を忘れないでくれ」


推定所要時間: 30分