プレースホルダ(バインド機構)(placeholder / bind variable)
SQLの中で値の場所を先に空けておき、あとから値だけを当てはめる書き方。SQLインジェクションの根本的な対策になる。
もう少し詳しい説明
何が問題なのか
SQLを文字列をつなげて作る書き方では、入力した値がSQLの一部になります。
"SELECT * FROM 利用者 WHERE 氏名 = '" + 入力 + "'"
入力の中に ' が含まれていると、文の区切りが変わります。 結果として、意図しない条件や命令が実行されることがあります。これがSQLインジェクションです。
プレースホルダ
値の場所を先に空けておき、あとから値だけを当てはめる書き方です。
SELECT * FROM 利用者 WHERE 氏名 = ?
| 手順 | すること |
|---|---|
| 1 | 値の場所を ? や :氏名 のような印にしてSQLを先に組み立てる |
| 2 | データベース側で、SQLの構造を確定させる |
| 3 | あとから値だけを渡す |
構造が確定したあとに値が入るので、値がSQLの命令として読まれません。 入力に ' や ; が含まれていても、それは値の中身として扱われます。
| 呼び名 | 同じものを指す |
|---|---|
| プレースホルダ | 値の場所を空けておく印 |
| バインド機構 | 値を当てはめる仕組み |
| バインド変数 | 当てはめる値を入れる変数 |
| 埋込み変数 | プログラムから値を受け取る変数(:講師コード のような書き方) |
2つの作り方
| 作り方 | いつ構造を確定させるか |
|---|---|
| 静的プレースホルダ | データベース側で確定させる。値は別に送る |
| 動的プレースホルダ | プログラム側で値を安全な形に直してから、文を組み立てる |
静的プレースホルダのほうが確実です。 値がデータベースに別に渡されるので、SQLの文として混ざる経路がありません。
根本対策と保険の対策
| 対策 | 立場 | すること |
|---|---|---|
| プレースホルダ | 根本対策 | 攻撃が成り立つ仕組みそのものをなくす |
| 入力の形の確認 | 保険 | 想定外の形を受け取らない |
| WAF | 保険 | 手前で怪しい通信を止める |
| 権限を絞る | 被害を抑える | 読み取りだけの権限にして、書き換えられないようにする |
| 詳しい誤りの内容を画面に出さない | 被害を抑える | 中身の手がかりを与えない |
根本対策は1つだけです。 他は、根本対策ができていない部分を補ったり、破られたときの被害を抑えたりするものです。
| 問われ方 | 答え |
|---|---|
| 根本的な対策はどれか | プレースホルダ |
| 当座をしのぐ対策はどれか | WAF |
使えない場合
値の部分には使えますが、SQLの構造の部分には使えません。
| 当てはめたいもの | プレースホルダで置けるか |
|---|---|
| WHERE句の値 | 置ける |
| 表名 | 置けない |
| 列名 | 置けない |
| 並べ替えの方向(昇順・降順) | 置けない |
構造の部分を入力で変える必要があるときは、あらかじめ決めた候補の中から選ぶ形にします。 入力された文字列をそのまま列名として埋め込む形は避ける、という扱いです。
エスケープ処理との違い
| やり方 | 中身 |
|---|---|
| プレースホルダ | 値とSQLを最初から分けて扱う |
| エスケープ処理 | 特別な意味を持つ文字に印を付け、文字として扱わせる |
エスケープ処理は、処理を漏らすと効きません。 1か所でも書き忘れると、そこから成り立ちます。プレースホルダは、値を別に渡す形なので書き忘れが起きにくくなります。
試験ではこう出る
科目A(旧・午前)では、SQLインジェクションの根本的な対策を問う形で出ます。プレースホルダが答えです。
根本対策と保険の対策を分ける形も頻出です。プレースホルダが根本、WAFが保険です。
午後や応用情報(情報システム開発、セキュリティ)では、対策の表の空欄に書く形で出ます。「根本的な対策として、SQL文の値の部分に何を使うか」という設問です。
関連する用語
- SQLインジェクション
- 防ぐ相手の攻撃。入力欄からSQLの断片を入れられる
- WAF
- 手前で止める保険の対策。プレースホルダは根本の対策
- ストアドプロシージャ
- あらかじめ用意した処理を呼ぶ形。値を引数で渡す
- SELECT文の基本(SELECT・FROM・WHERE)
- 値を当てはめる先のSQL
ミニクイズ
SQLインジェクションの根本的な対策として、最も適切なものはどれか。
正解は 4番:SQL文の値の部分をプレースホルダにし、あとから値だけを当てはめる
プレースホルダは、SQL文の構造を先に確定させ、あとから値だけを当てはめる仕組みです。値がSQLの命令として解釈されないので、入力にSQLの断片が入っていても構造が変わりません。WAFは手前で止める保険の対策で、書き方そのものは直りません。マルウェア対策ソフトは不正なプログラムを扱うもの、TLSは通信の途中を守るもので、いずれもこの攻撃の対策ではありません。
この分野をまとめて解く → セキュリティのミニテスト(全47問)
最終更新:2026-11-09