SQLインジェクション(SQL injection)
入力された文字がデータベースへの命令の一部として解釈されてしまう攻撃。
もう少し詳しい説明
SQLインジェクションは、入力した文字が、データベースへの命令の一部として読まれてしまう攻撃です。インジェクションは「注入」という意味で、命令の中に別の命令を注ぎ込む、という名前になっています。
先に言葉を2つ説明します
データベースは、データを決まった形でためておき、必要なものを取り出せるようにした仕組みです。会員の名簿や商品の一覧などが、ここに入っています。
SQL(Structured Query Language、エスキューエル)は、そのデータベースに「こういうデータを出して」「これを書き換えて」と伝えるための言語です。人が書く命令文だと思ってください。
なぜ起きるのか
Webサイトが検索欄やログイン欄に入力された文字を受け取ると、その文字を使ってデータベースへの命令(SQL)を組み立てます。たとえば「入力された名前と一致する行を探せ」という命令です。
このとき、入力された文字をそのまま命令の文字列につなげてしまうと、問題が起きます。
SQLの文には、条件の区切りや文の終わりを表す特別な記号があります。たとえば、文字をくくるための引用符(')がそれにあたります。
サイトの側は、入力された文字を引用符でくくって命令を組み立てます。ところが、入力の中にその引用符が混ざっていたらどうなるか。
くくるつもりだった引用符が、途中で閉じてしまいます。 サイトは「ここからここまでが名前」のつもりで渡したのに、データベースは「名前はここまで。その先は次の指示だ」と読みます。入力したはずの文字が、値ではなく命令として実行されます。
原因を一言でいえば、値と命令の区別がなくなっていることです。サイトは値のつもりで渡し、データベースは命令として読む。この食い違いが攻撃の入口になります。
何をされるのか
命令を書き換えられるので、被害は広い範囲に及びます。
- 本来は見えないはずの個人情報や会員情報をまとめて抜き取られる
- パスワードの照合をすり抜けて別人としてログインされる
- データを書き換えられる、消される
とくに2つめが、この攻撃の怖いところです。 ログインの照合は「この利用者IDとパスワードの組が、表の中にあるか」を探す命令です。その条件の部分を書き換えられると、パスワードを知らなくても「条件に合う」ことにされてしまいます。
情報漏えい事件の原因として、実際に多く報告されてきた攻撃です。
対策:値を値のまま渡す
対策の考え方は単純で、入力された文字を、命令として読ませないことです。
もっとも確実なのがプレースホルダ(バインド機構)です。
プレースホルダは、命令の中で値が入る場所に置いておく、「ここに値が入ります」という目印です。そして「この形の命令を実行する。値はこれだ」と、骨組みと値を分けてデータベースに渡します。
文字をつなげて1本の命令を作るのではなく、骨組みと値を別々に渡す、というところが違いです。
こうすると、データベースは命令の形を先に確定させてから値を当てはめます。値の中に特別な記号が入っていても、すでに命令の形は決まっているので、もう構造は変わりません。
引用符が混ざっていても、ただの引用符という文字として扱われます。 命令の区切りにはなりません。原因である「値と命令の混ざり」が消えるため、根本的な対策になります。
次善の策として、エスケープ処理もあります。特別な意味を持つ文字の前に決まった印を付けて、ただの文字として扱わせる処理です。ただし処理の漏れが1か所でもあれば破られるので、プレースホルダが使える場面ではそちらを選びます。
そのうえで、被害を小さくする備えも並べて問われます。
| 対策 | 何をするか | 位置づけ |
|---|---|---|
| プレースホルダ | 命令の骨組みと値を分けて渡す | 根本対策。まずこれ |
| エスケープ処理 | 特別な記号をただの文字にする | 次善。漏れると破られる |
| 最小権限 | 必要な操作だけを許す設定にする | 破られたときの被害を小さくする |
| WAF | 怪しい通信を手前で遮る | 保険。根本対策の代わりにはならない |
下の2つも補っておきます。
- 最小権限の原則 … そのプログラムに必要な操作だけを許しておくこと。読むだけでよいなら、書き換えや削除は許さない。破られても、できることが限られる
- WAF(Web Application Firewall、ワフ)… Webへの通信を手前で見て、怪しいものを遮る仕組み。攻撃の形を見分けて止めるので、知らない形の攻撃は通ってしまう
入力値の検証だけでは足りない
「入力欄で文字数を制限すればよい」「記号を禁止すればよい」と考えがちですが、これだけでは不十分です。短い入力でも成立しますし、禁止する文字を挙げていく方式は必ず漏れが出ます。
入力を疑って弾くのではなく、入力が何であっても命令の形が変わらないようにする。この違いが、対策を選ぶ問題の分かれ目になります。
試験ではこう出る
科目A(旧・午前)のセキュリティ分野で頻出です。
多いのは、攻撃の説明を示して名前を選ばせる形と、対策として適切なものを選ばせる形です。対策を問う問題では、プレースホルダ(命令の骨組みと値を分けて渡す仕組み)が正解になることがほとんどです。
応用情報では、他の攻撃と並べて「どの脆弱性(攻撃に使われてしまう、作りの弱いところ)に対する対策か」を組み合わせる形や、午後の問題で具体的な設計の中で問われます。
似た名前の攻撃と混ざりやすいので、どこで何が起きるかで区別してください。
| 狙われる場所 | 何が起きる | |
|---|---|---|
| SQLインジェクション | サーバ(応えを返す側の機械)のデータベース | 命令が書き換えられ、データを抜かれる |
| クロスサイトスクリプティング | 閲覧者のブラウザ(Webページを見るソフト) | 仕込まれたプログラムが閲覧者の側で動く |
どちらも「入力をそのまま扱ってしまう」ことが原因という点は共通していて、ここが分かっていると対策の問題にも答えやすくなります。
関連する用語
- プレースホルダ(バインド機構)
- 命令の骨組みを先に決め、値を後から当てはめる仕組み。この攻撃の根本的な対策
- クロスサイトスクリプティング
- 入力をそのまま扱うのが原因という点は同じ。ただし動く場所は閲覧者のブラウザ
- エスケープ処理
- 特別な意味を持つ文字を、ただの文字として扱わせる処理
- 最小権限の原則
- 必要な権限だけを与えること。破られたときの被害を小さくする備え
- WAF
- Webへの通信を見て怪しいものを遮る仕組み。根本対策ではなく、あくまで保険
- トランザクション
- これ以上分けられない処理のまとまり
ミニクイズ
SQLインジェクションへの対策として、最も根本的で効果が高いものはどれか。
正解は 1番:プレースホルダを用いて、命令の構造を先に確定させてから値を当てはめる
この攻撃は、入力された文字が値ではなく命令の一部として解釈されてしまうことで起こります。プレースホルダを使うと、命令の骨組みをデータベース側が先に確定させ、入力は最後まで値としてしか扱われません。入力に何が書かれていても命令の形が変わらないので、原因そのものが消えます。文字数の制限は短い入力を防げず、回数制限はパスワードの総当たりへの対策です。通信の暗号化(中身を他人には読めない形に変えること)は途中で盗み見られることを防ぎますが、この攻撃は入力欄から正しい手順で送られてくるので効きません。
この分野をまとめて解く → セキュリティのミニテスト(全47問)
最終更新:2026-09-15