📌 結論から理解する
SQLインジェクション=「悪意ある命令をDBに送り込む攻撃」
Webフォームなどの入力欄に特殊なSQL文を混ぜて送り込み、データベースを不正操作する攻撃です。
個人情報の大量流出事件の多くがSQLインジェクションが原因です。
SQLインジェクションが起きる理由
攻撃の仕組み
① 正常なログイン
ID: yamada
PW: password123
→ SELECT * FROM users WHERE id='yamada' AND pw='password123'
PW: password123
→ SELECT * FROM users WHERE id='yamada' AND pw='password123'
② 攻撃者の入力
ID: ' OR '1'='1
PW: 何でもよい
→ SELECT * FROM users WHERE id='' OR '1'='1' AND pw='...'
PW: 何でもよい
→ SELECT * FROM users WHERE id='' OR '1'='1' AND pw='...'
→ 常に真になるのでログイン成功してしまう!
SQLインジェクションでできること
- 情報漏えい:全ユーザーのID・パスワード・個人情報を取得
- データ改ざん:UPDATE文で価格・残高などを書き換え
- データ削除:DROP TABLE で全データを消去
- 認証回避:ログインをバイパスして管理画面に侵入
対策
✅ プレースホルダ(バインド機構)
SQL文の構造とデータを分離して処理。入力値をSQL命令として解釈させない。最も効果的な対策。
SQL文の構造とデータを分離して処理。入力値をSQL命令として解釈させない。最も効果的な対策。
✅ エスケープ処理
シングルクォート(')などの特殊文字を無害化する。
シングルクォート(')などの特殊文字を無害化する。
✅ 入力値の検証
数値フィールドには数値のみ許可するなど、型・形式を厳密にチェック。
数値フィールドには数値のみ許可するなど、型・形式を厳密にチェック。
✅ DBアカウントの最小権限
Webアプリ用DBアカウントにDROP・DELETE権限を付与しない。
Webアプリ用DBアカウントにDROP・DELETE権限を付与しない。
✅ WAFの導入
既知の攻撃パターンを自動的に遮断する。
既知の攻撃パターンを自動的に遮断する。
試験では「プレースホルダの使用」が最も根本的な対策として正解になりやすい。
よくある勘違い
「WAFを導入すれば完全に防げる」は誤り。WAFは補完的対策。根本対策はセキュアなコーディング(プレースホルダ)。
エラーメッセージにSQL文やDB構造を表示すると攻撃者にヒントを与える。エラーは詳細を出さないこと。
🧠 確認クイズ
Q1. SQLインジェクションの根本的な対策として最も適切なのは?
Q2. SQLインジェクションで起こりうる被害でないものは?
Q3. SQLインジェクション対策としてDBアカウントの権限を最小にする理由は?