プリペアド ステートメントの基本的な理解が深まり、SQL インジェクション攻撃を防ぐことができるようになりました。しかし、なぜそれらが上記の攻撃から保護するのかをまだ理解していません. 同様の質問があることは知っていますが、完全に満足のいく答えが見つかりませんでした。
例 - 非常に安全でないコード
したがって、ここにデータベースと通信するための最も基本的な方法があります。
$query = "SELECT * FROM users where id=$username";
保護がなければ、ユーザーは悪意のあるコードを入力し、データベース エンジンを「だまして」壊滅的なクエリを実行することができます。
$username = "1; DROP TABLE users;"
SELECT * FROM users where id=1; DROP TABLE users;
私が理解していないのは、準備されたステートメントがそのようなデータを「除外」する方法です。上記のような SQL クエリを生成するようにデータベースを誘惑しない背後にあるメカニズムは何ですか? 上記の例のセミコロンなど、特定の文字をエスケープするのと同じくらい簡単ですか、それとももっと複雑ですか?
例のように正確なインジェクション攻撃を行い、準備されたステートメントを介して実行した場合、どのようなコマンド文字列がデータベース エンジンに到達するでしょうか?