【ばいんどへんすう】
バインド変数 とは?
💡 SQLの「穴埋め問題方式」、安全にユーザー入力を組み込む仕組み
📌 このページのポイント
- プリペアドステートメントとも呼ばれる
- SQLインジェクション攻撃を根本的に防ぐ最も効果的な手段
- DBが実行計画をキャッシュして再利用できるためパフォーマンスも向上
- 「?」(MySQL・SQLite)や「$1, $2」(PostgreSQL)や「:name」(Oracle)など書き方が異なる
バインド変数って何のためにあるの?
2つの目的がある。①セキュリティ:「WHERE name = ?」として?に値を後から渡せばSQLに特殊文字が混入しても安全(SQLインジェクション防止)。②パフォーマンス:DBが実行計画をキャッシュして繰り返し使えるから高速化できる。
使わないとどんな問題が?
文字列でSQLを組み立てると「WHERE name = '」+ユーザー入力+「'」という書き方になる。ユーザーが「'; DROP TABLE users; --」と入力するとDBが破壊されるSQLインジェクションが起きる。バインド変数を使えばユーザー入力がSQL文として解釈されない。
Pythonでの書き方は?
バインド変数を使わないとSQLインジェクション以外にも問題があるの?
まとめ:ざっくりこれだけ覚えればOK!
バインド変数って出てきたら「SQLに?などのプレースホルダを使い値を後から埋め込む仕組み、SQLインジェクション防止の基本」と思えばOK!
📖 おまけ:英語の意味
「Bind Variable(Prepared Statement)」 = 束縛変数・変数の紐付け
💬 SQLに「変数を束縛(bind)する」ことから。「プリペアドステートメント(Prepared Statement)」とも呼ばれ、事前にSQLを準備して後から値を差し込む方式