SQLインジェクションとは(全体像)
Webアプリの多くは、入力された内容を使ってデータベースに命令(SQL)を出す。たとえば「この名前の利用者を探して」のように。
ところが、入力をそのまま命令に混ぜてしまうと、攻撃者が入力欄に「命令の続き」を書き込むことで、本来見えないデータを取り出したり書き換えたりできてしまう。これがSQLインジェクション。典型例は `' OR '1'='1` のような入力だ。
押さえるのは、根本の対策(プレースホルダ)と、5種類の手口だ。
詳しく:種類と対策を押さえる
ここが心臓部。まず手口の5種類を整理する(名前と「どう情報を取るか」をつかめば十分)。
SQLインジェクションの5種類
| 種類 | どう情報を取るか |
|---|---|
| UNION(Classic) | UNION文で別のテーブルの情報をくっつけて取り出す |
| Error | わざとエラーを起こし、エラーメッセージから情報を漏らす |
| Blind Boolean | 応答の正否(True/False)の違いから1つずつ推測する |
| Blind Time | 応答時間の差(SLEEPなど)から推測する |
| Out-of-Band | DNSやHTTPなど別の通り道で情報を取り出す |
そして、対策の優先順位がよく問われる。
SQLインジェクションの対策
| 対策 | 位置づけ |
|---|---|
| プレースホルダ(パラメータ化) | 最重要・根本対策。入力を「データ」として扱い、命令にしない |
| エスケープ | 危ない文字を無害化する補助的な対策 |
| WAF | 入口で怪しい入力をふるい落とす。ただし単独では不十分 |
言葉を噛み砕いておく。
- プレースホルダ(パラメータ化クエリ) … 命令の「枠」を先に決めておき、入力はあとから値としてはめ込むだけにする方法。入力が命令として解釈されないので、根本から防げる。最優先の対策。
- エスケープ … 危ない記号を無害な形に変換する補助。プレースホルダの代わりにはならない。
- 多層防御 … WAF(入口の門番)だけに頼らず、プレースホルダなど複数の守りを重ねる考え方。
わかりやすく言い換えると
つまり、SQLインジェクションは「注文票に、裏の命令をこっそり書き込む」攻撃にたとえるとスッと入る。
レストランで、料理名の欄に「ステーキ。ついでに金庫を開けて」と書いたとする。もし店員(プログラム)が、書かれた文をそのまま命令として実行してしまえば、金庫が開いてしまう。SQLiは、入力を命令として解釈させてしまう隙を突く攻撃だ。
これを根本から防ぐのがプレースホルダ。「料理名の欄は、必ず料理名としてだけ扱う」と先に決めておけば、何を書かれても命令にはならない。エスケープ(危ない文字を無害化)やWAF(門番)は補助で、プレースホルダと重ねて使うのが安心、というわけだ。
試験のツボ
🔴 一番出る:最重要の対策はプレースホルダ
①プレースホルダ=入力をデータとして扱い、命令にしない(根本対策)
②エスケープは補助・WAFは単独では不十分(多層防御)
🔴 次に出る:5種類の手口
①UNION・Error・Blind Boolean・Blind Time・Out-of-Band
②応答の正否や時間差から推測するのがBlind系
🟡 押さえると安定:SQLiは入力を命令として実行させる攻撃でOWASPのA03。典型例は「' OR '1'='1」
よくある間違い
①「SQLインジェクション対策はエスケープだけで十分」→ ✗ 最優先はプレースホルダ。エスケープは補助で、それだけでは不十分。
②「WAFを入れれば単独で完全に防げる」→ ✗ WAFは入口の門番。プレースホルダなどと重ねる多層防御が必要。
③「SQLインジェクションは通信を暗号化する技術のこと」→ ✗ 暗号化ではなく、入力から悪意のSQLを注入する攻撃のこと。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(SQLインジェクションとは)
SQLインジェクションに関する次の記述のうち、正しいものはどれか。
- SQLインジェクションは通信を暗号化するための技術で、攻撃とは無関係のしくみであるとされているのだ
- SQLインジェクションはサーバの電源を物理的に切り替える作業のことで、入力とはいっさい関係しないとされている
- SQLインジェクションは画面を見やすく拡大するための表示の補助技術にすぎないとされているのだ
- SQLインジェクションは入力欄から悪意のあるSQLを注入し、データを盗んだり書き換えたりする攻撃である
解答は 4 である。
SQLインジェクションは、入力欄から悪意のあるSQL(データベースへの命令)を注入する攻撃。入力を命令として実行させ、データを盗んだり書き換えたりする。OWASPのA03にあたる。
選択肢1の暗号化、選択肢2の電源切り替え、選択肢3の画面拡大は、いずれも誤りだ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 暗号化技術ではなく攻撃 |
| 2 | ✗ | 電源切り替えとは無関係 |
| 3 | ✗ | 画面拡大の技術ではない |
| 4 | ✓ | 入力から悪意のSQLを注入する攻撃で正しい |
オリジナル問題2(最重要の対策)
SQLインジェクションの対策に関する次の記述のうち、正しいものはどれか。
- 最重要の対策はプレースホルダで、入力を値として扱い命令としては実行させないことが根本の対策である
- 最重要の対策は通信の暗号化だけで、入力を命令として実行させない工夫はいっさい不要とされているのだ
- 対策は不要で、入力された内容はそのまま命令として実行しても問題は起きないとされているのが実情である
- 最重要の対策は画面の文字を大きくすることで、入力の扱い方とはまったく関係がないとされているものだ
解答は 1 だ。
最重要の対策はプレースホルダ(パラメータ化)。入力を「値(データ)」として扱い、命令として実行させないことが根本の対策になる。
選択肢2は「暗号化だけ」が誤り。選択肢3は「対策不要」が誤り。選択肢4は「文字を大きくする」が誤りだ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | プレースホルダが根本対策で正しい |
| 2 | ✗ | 暗号化だけでは防げない |
| 3 | ✗ | 対策は必要 |
| 4 | ✗ | 文字の大きさとは無関係 |
オリジナル問題3(多層防御と手口)
SQLインジェクションの対策や手口に関する次の記述のうち、正しいものはどれか。
- エスケープだけで完全に防げるため、プレースホルダや多層防御はいっさい不要とされているのが実情である
- WAFを入れればそれ単独で完全に防げるため、ほかの対策はまったく要らないとされているものなのである
- 手口にはUNIONやError、Blindなどがあり、プレースホルダを軸にWAFなども重ねる多層防御が有効である
- SQLインジェクションには手口が1種類しかなく、対策の優先順位をそもそも考える必要はいっさいないとされているのだ
解答は 3 だ。
手口にはUNION・Error・Blindなどがあり、対策はプレースホルダを軸に、WAFなども重ねる多層防御が有効。1つの対策だけに頼らないのがポイントだ。
選択肢1は「エスケープだけで完全」が誤り。選択肢2は「WAF単独で完全」が誤り。選択肢4は「手口が1種類」が誤りだ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | エスケープだけでは不十分 |
| 2 | ✗ | WAF単独では防ぎきれない |
| 3 | ✓ | 手口は複数・プレースホルダ軸の多層防御で正しい |
| 4 | ✗ | 手口は複数あり優先順位も大事 |
まとめ
押さえどころ
- 🔴 SQLインジェクション = 入力欄から悪意のSQLを注入し、入力を命令として実行させる攻撃(OWASP A03)。
- 🔴 最重要の対策はプレースホルダ(入力をデータとして扱い命令にしない)。エスケープは補助、WAFは単独では不十分。
- 🟡 手口は5種類(UNION・Error・Blind Boolean・Blind Time・Out-of-Band)。複数を重ねる多層防御が有効。
次に学ぶ
- OWASP Top 10 ── SQLインジェクションが入る、Webアプリ脆弱性のワースト10。
- NWセキュリティ(FW・IDS/IPS・WAF) ── 多層防御で使うWAFなど、入口を守るしくみ。
- CVE(脆弱性識別子) ── 個々の脆弱性に世界共通の番号を付けるしくみ。
執筆: SikakuQuest編集部