セキュリティ
SQLインジェクション:入力欄からデータベースを操られる
2026年8月17日

レン
検索機能を作った!入力された文字でデータベースを検索するんだ。

ウィルスン
ほう。その入力された文字を、そのまま検索の命令文に混ぜているのではないか?だとすれば、ワタシは検索語のふりをして「命令」を送り込めるということだ。

レン
検索してるだけなのに、命令できるの…?

プロクラ
できてしまうんだ。データベースへの指示は文字列で組み立てるよね。そこに利用者の入力をそのまま貼り付けると、入力の中身が「データ」なのか「命令」なのか、データベース側で区別がつかなくなる。
守りは「重ねる」のが基本
攻撃
ファイアウォール
不要な入口を塞ぐ
SSH鍵認証
総当たりを無効化
OS更新
既知の穴を埋める
サーバー
1つ破られても次の層で止まる。どれか1つでは不十分
何をされるのか

ウィルスン
検索結果に、本来見えないはずの全員分のデータを混ぜて表示させる。ログイン画面なら、パスワードを知らずに認証を通す。場合によってはテーブルごと消すこともできる。入力欄1つで、そこまで届くのだよ。

レン
入力欄ひとつでそこまで!?

プロクラ
しかも、画面に何も表示されない形でも成立する。応答の違いを1つずつ確かめて、中身を少しずつ読み出す手口もあるんだ。「エラーが出ないから大丈夫」は根拠にならないよ。
防ぎ方:命令とデータを分けて渡す

プロクラ
対策はほぼ1つに集約されるよ。文字列を連結して命令文を作るのをやめて、「ここに値が入る」という場所を用意した命令文と、値そのものを別々にデータベースへ渡すんだ。これをパラメータ化クエリ(プレースホルダ)と言う。
プロクラ
こうすると、渡された値は必ず「データ」として扱われる。中に命令のような文字が含まれていても、ただの文字列として検索されるだけなんだ。

プロクラ
ここが根本的な解決である理由は、入力の中身を検査していないところにある。何が来ても構造が壊れないので、想定外の書き方を思いつかれても関係ないんだ。
パラメータで渡せない場所がある

プロクラ
ただし、値の部分は差し込めても、テーブル名や並べ替えの向きのような「構造」の部分は差し込めないんだ。ここに利用者の入力を混ぜたくなったときが、いちばん危ない。
- 並べ替えの列名や向きを、利用者に選ばせる場合
- 検索条件の数によって、命令文を組み立て直す場合
- 対策は、許可する値をあらかじめ一覧にして、その中から選ばせること
- 受け取った文字をそのまま使わない。照合して、こちら側が持つ値に置き換える
やってはいけない対策
- 危険な文字を自分で除去しようとする(漏れが出る。抜け道が次々見つかっている)
- 入力の長さ制限だけで防いだつもりになる
- 画面側(ブラウザ)の検証だけで済ませる(サーバーへ直接送られたら無意味)

プロクラ
最近のフレームワークやORMを普通に使っていれば、自動的にパラメータ化されることが多いよ。危ないのは、速度や柔軟性のために自分で命令文を組み立てたときだね。そこだけは特に慎重に。
破られたときの被害を小さくする

プロクラ
対策は入口だけじゃない。万一通されたときに、できることを減らしておく備えもある。
- アプリが使うデータベースの利用者に、必要な権限だけを与える
- テーブルを消す権限や、他のデータベースを見る権限は与えない
- データベースを外部から直接接続できない場所に置く
- エラーの詳細を画面に出さない(構造を教えることになる)
- パスワードは元に戻せない形で保存する(読まれても即座には使えない)

ウィルスン
…エラー画面か。あれは親切でな。どのデータベースを使い、どんな命令文を組み立てているかを、丁寧に教えてくれる。ワタシにとっては地図のようなものだ。

レン
値は分けて渡す。構造は一覧から選ばせる。権限も絞っておく。
あわせて読みたい
- セキュリティXSS:投稿された内容が他の人のブラウザで動く被害を受けるのがサーバーではなく訪問者である理由、表示するときに無害化するという原則、投稿でHTMLを許可したい場合の扱い、そして盗まれるものを減らす備えを解説します。
- セキュリティ使わなくなったVPSを放置するとどうなるか止めたつもりでも課金は続き、更新されないサーバーは他人に使われます。放置で起きることと、閉じるときにやるべきことを順に解説します。
- セキュリティ事業者から「攻撃の踏み台になっている」と連絡が来たら自分のサーバーが加害側になったときの初動。優先すべき順番と、通信を止めることが最優先である理由、そして復旧までの進め方を解説します。
- セキュリティ総当たり攻撃のログが止まらない:無視していいのか毎日大量に届く認証失敗の記録を、どこまで気にすべきか。放置してよい条件と、本当に危ない記録の見分け方、ログを減らす手段を解説します。