SQLインジェクション — 入力からDBに不正な命令を送り込む

初級の解説は準備中のため、初級の内容を表示しています。

概要 — まず全体をつかむ

SQLインジェクションは、入力を通じてDBに不正な命令を送り込む攻撃です。「データのはずの入力が、命令になってしまう」のが本質です。

詳細 — 1段階ずつ追う

どう起きる?

DBへの命令(SQL)を、入力をそのまま文字列でつなげて作ると危険です。

たとえば「名前で検索」のとき、入力欄に普通の名前ではなく命令の切れ端を入れられると、それが命令の一部として解釈され、全件を抜き出す・消す・ログインを突破する、といったことが起きます。

アニメーション『SQLインジェクション(命令とデータの分離)』を開く
⚠ 危険:入力をそのまま連結入力欄(名前など)' OR '1'='1連結組み立てられたSQL(入力が命令の一部に化ける)SELECT * FROM usersWHERE name = '' OR '1'='1'結果:条件が常に真認証回避・全件取得ができてしまう入力(データのはず)が「命令」として解釈されてしまったWHERE の条件が「name='' または 1=1」となり、1=1 は常に成立 → 全行が対象に✓ 安全:パラメータ化(プレースホルダ)入力欄(名前など)' OR '1'='1値として渡す命令の骨組みは先に固定・入力は別枠(?)へSELECT * FROM usersWHERE name = ? ← 入力はここへ“データ”として結果:ただの検索語入力は命令に化けない(該当なしで安全)入力は必ず「値(データ)」として扱われ、命令として動かない入力全体が name の検索語(= "' OR '1'='1" という名前を探す)になるだけ要:命令(SQL)とデータ(入力)を分離する

どう防ぐ?

  1. パラメータ化クエリ(プレースホルダ) — 命令の骨組みを先に固定し、入力は「値(データ)」として別枠で渡す。これなら入力は命令として動かない
  2. 文字列連結でSQLを組み立てない — これが鉄則
  3. 最小権限 — アプリのDBユーザーに、必要以上の権限(削除・全件)を与えない
  4. 入力検証 — 補助として、型や形式も確かめる

⚠️ 気をつける

  • エスケープ自作に頼る — 自前の文字置換は抜けやすい。パラメータ化が正解
  • エラーメッセージの露出 — DBのエラーをそのまま返すと、構造のヒントを与えてしまう
  • ORMでも油断しない — 生SQLを組み立てる箇所は同じリスク

理解度チェック

そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。

1. SQLインジェクションが起きる原因に最も近いのは?

2. SQLインジェクションの王道の防ぎ方は?

3. 「名前で検索」の入力欄に 普通の名前ではなく命令の切れ端を入れられると 何が起こりうる?

4. 文字列連結でSQLを組み立てることについて 正しいのはどれ?

5. DBのエラーメッセージをそのまま画面に返すと なぜまずい?

6. 「ORMを使っているから安全」と言えるか?

7. アプリのDBユーザーに 削除や全件取得などの必要以上の権限を与えないことを 漢字4文字で何という?

8. 自前で危険な記号を置き換える「○○の自作」は抜けやすく避けるべき。○○に入るカタカナは?

SQLインジェクション — 入力からDBに不正な命令を送り込む | Kotowary