【ぷりぺあどすてーとめんと】

プリペアドステートメント とは?

💡 SQL文の骨格を先に固めて、値だけ差し込む安全装置
📌 このページのポイント
プリペアドステートメント — SQLインジェクション防止 文字列結合(危険) "SELECT * FROM users WHERE id=" + input 入力: 1 OR 1=1 → 全レコード漏洩! プリペアド(安全) "SELECT * FROM users WHERE id = ?" 入力: 1 OR 1=1 → 文字列として扱われ安全 プリペアドステートメントの仕組み ① SQL構文を 事前コンパイル ② パラメータを 値としてバインド ③ 構文と値が 分離されて実行 構文が確定済みなので、入力値がSQL命令として解釈されない ? や :name がプレースホルダー
プリペアドステートメントによるSQLインジェクション防止
ひよこ ひよこ

プリペアドステートメントって何を準備してるの?

ペンギン先生 ペンギン先生

SQL文のテンプレートをDB側で先にコンパイルしておくんだ。SELECT * FROM users WHERE id = ? みたいに、パラメータ部分をプレースホルダにしておいて、後から値だけ渡すよ

ひよこ ひよこ

それでSQLインジェクションを防げるの?

ペンギン先生 ペンギン先生

そうだよ。SQL文の構造が先に確定してるから、後から渡される値はあくまでデータとして扱われる。悪意のあるSQL文を値に仕込んでも、SQL文の一部として解釈されないんだ

ひよこ ひよこ

パフォーマンスもよくなるって本当?

ペンギン先生 ペンギン先生

同じSQL文を何回も実行するなら、パース・構文解析・実行計画の作成が1回で済むからね。バッチ処理で何千回もINSERTするような場面だと効果が大きいよ

ひよこ ひよこ

クエリビルダーを使ってたら気にしなくていいの?

ペンギン先生 ペンギン先生

クエリビルダーORMは内部的にプリペアドステートメントを使ってることが多いから、普段は意識しなくてもOK。でも生SQLを書く場面では必ず使うべきだし、LIKE句のワイルドカードエスケープは別途必要だから注意だよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「プリペアドステートメント」って出てきたら「SQLインジェクションを防ぐ安全なSQL実行方法」と思えればだいたいOK!
📖 おまけ:英語の意味
「Prepared Statement」 = 事前に準備された文
💬 Prepared(準備された)Statement(文)で、SQL文をあらかじめ準備しておくという意味だよ
← 用語集にもどる