プレースホルダ(バインド機構)(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