【ばいんどへんすう】
バインド変数 とは?
最終更新:
💡 SQLの「穴埋め問題方式」、安全にユーザー入力を組み込む仕組み
SQLの中に「?」や「$1」などのプレースホルダを置き、値を後から別に渡す仕組み。値がSQL文として解釈されないためSQLインジェクション対策の基本になり、DBによっては実行計画の再利用にも役立つ。
📌 このページのポイント
- SQLの形と値を分けて渡す仕組みで、プリペアドステートメント(パラメータ化クエリ)と組み合わせて使われる
- 値として渡した入力はSQL文として解釈されないため、SQLインジェクション対策の第一の手段とされる
- テーブル名・列名・並び順(ASC/DESC)などは値として渡せないので、決められた候補から選ぶ設計が必要
- 書き方は「?」「$1」「:name」「%s」などDBやドライバーによって違う
バインド変数って何のためにあるの?
いちばんの目的はSQLインジェクション対策だよ。「WHERE name = ?」のようにSQLの形を先に決めて、?に入る値は別に渡す。するとDBは「ここはコード、ここはデータ」と区別できるから、入力に記号が混ざっていても値として扱われるんだ
使わないとどんな問題が?
Pythonでの書き方は?
バインド変数を使えば何でも安全なの?
守れるのは「値」の部分だけなんだ。テーブル名や列名、ORDER BYのASC/DESCはプレースホルダにできないから、そこにユーザー入力を入れるなら、そのまま使わずに「決められた候補から選ぶ」形にする必要があるよ
速くなるって聞いたけど本当?
もっと詳しく知りたい人へ
列名や並び順をユーザーに選ばせたいときはどうする?
入力をそのままSQLに入れず、アプリ側で許可した候補に対応づけるよ。たとえば並び順なら、入力を「昇順か降順か」の真偽値に変換してから、プログラムがASCかDESCのどちらかを選んでSQLに書く。OWASPのチートシートでも、バインド変数が使えない部分には入力の検証やクエリの設計変更で対処するよう勧めているよ。
📖 おまけ:英語の意味
「Bind Variable」 = 束縛変数・変数の紐付け
💬 SQLの中の変数に値を結びつける(bind)ことから来ているよ。事前にSQLを準備して値を後から渡す「プリペアドステートメント(Prepared Statement)」と一緒に使われることが多いんだ