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