【えすきゅーえるいんじぇくしょん】

SQLインジェクション とは?

最終更新:
💡 入力がSQL命令に混ざり、DBへの処理を変えられる攻撃

外部から受け取る入力がSQLの命令として解釈され、意図しない問い合わせや更新が実行される攻撃。情報漏洩や改ざんなどにつながる。

📌 このページのポイント
SQL命令と入力値の扱いを分ける 入力を直接連結 値が命令に混ざる 検索・更新を改変 値をパラメータ化 決めたSQL+別の値 値はデータとして扱う 表名・列名は許可した候補から選ぶ DBの権限も必要な範囲に絞る
正しく値を束縛する対策の概念図。ORMやストアドプロシージャも、危険なSQLの組み立て方なら脆弱になる。
ひよこ ひよこ
どんな攻撃なの?
ペンギン先生 ペンギン先生
外部入力をSQL文へ直接つなぐと、検索する値のはずがSQL命令の一部として解釈されることがあるんだ。その結果、検索条件を変えられたり、データを不正に読み取られたりする。入力欄だけでなく、アプリが受け取るパラメータにも注意が必要だよ。
ひよこ ひよこ
ペンギン先生 ペンギン先生
「SELECT * FROM users WHERE id = ?」のようにSQL文を決め、値を別のパラメータとして渡す仕組みだよ。正しく値を束縛すれば、その値はSQL命令として解釈されない。ただし表名や列名など、値のパラメータにできない部分は、許可した候補から選ぶ設計が必要なんだ。
ひよこ ひよこ
ORMを使えば安全?
ペンギン先生 ペンギン先生
使っているだけで安全とは限らないよ。ORMでも文字列を直接つないで生SQLや問い合わせを作れば問題になる。安全なパラメータ指定を使うことが大切。ストアドプロシージャも、内部で危険な動的SQLを組み立てれば脆弱になるよ。
ひよこ ひよこ
被害を減らすために、ほかにできることは?
ペンギン先生 ペンギン先生
アプリからDBへ接続するアカウントの権限を、必要な表と操作に絞るんだ。読み取りだけ必要なら更新や管理者の権限は与えない。入力の形式も検査するけれど、検査を通ったからSQLへ直接つないで安全とは限らないよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「SQLインジェクション」って出てきたら「入力がSQL命令に混ざり、DBへの処理を変えられる攻撃」と思えばだいたいOK!
📖 おまけ:英語の意味
「SQL Injection」 = SQL注入
💬 Injection(注入)。ユーザー入力にSQLを「注入」して不正実行させる攻撃だよ

参考資料

← 用語集にもどる