Solved
SQLインジェクションをパラメータ化クエリで防げる理由
Taro · 6/19/2026 · 42 views
SQLインジェクション対策として「パラメータ化クエリを使え」とよく言われますが、なぜ文字列連結だと危険でパラメータ化なら安全なのか、仕組みを教えてください。
Taro · 6/19/2026 · 42 views
SQLインジェクション対策として「パラメータ化クエリを使え」とよく言われますが、なぜ文字列連結だと危険でパラメータ化なら安全なのか、仕組みを教えてください。
文字列連結でSQLを組み立てる場合、ユーザーの入力値がそのままSQL文の一部として解釈されてしまいます。例えば
"SELECT * FROM users WHERE name = '" + input + "'"
という書き方だと、inputに' OR '1'='1のような値を入れられると、SQL文の構造そのものが書き換えられてしまい、意図しない全件取得や不正な操作が可能になります。
パラメータ化クエリ(プレースホルダ + バインド変数)は、SQL文の「構造」とユーザーが渡す「値」を最初から別々にデータベースへ渡します。
SELECT * FROM users WHERE name = $1
のようにプレースホルダを使い、$1にはinputの値をパラメータとして渡します。データベース側はSQL文の構文解析を先に完了させた後で、渡された値を純粋な「データ」としてそこにはめ込むだけなので、値の中にどんな文字列が入っていてもSQL文の構造が書き換わることはありません。
つまり文字列連結は「SQL文自体を毎回組み立て直している」のに対し、パラメータ化クエリは「あらかじめ決まった構造に、後から安全にデータを差し込んでいる」という根本的な違いがある、と理解すると分かりやすいと思います。
✓ This question has been solved