PDO でパラメーター化されたクエリを使用して、かなり複雑なクエリで MySQL データベースからデータを取得しています。これを行う一環として、次のようなコードを使用します。
クエリ:
$query = "SELECT * FROM table WHERE something = :id_$id";
$stmt = $db->prepare($query);
パラメータバインディング:
$stmt->bindParam(":id_$id", $id);
私の理解では、PDO は bindParam への呼び出しで置換文字列を「クリーニング」することにより、パラメーター化された入力をサニタイズしますが、私の質問は 、攻撃者が望ましくない SQL を挿入するために ($id の値を介して) 上記のような構造を悪用できるかどうかです。 ?
PDO は :id_$id のテキストを $id のサニタイズされた値に置き換えます。そのため、:id_$id のどの部分も最終的なクエリに含まれるべきではないと思いますが、明確な答えを得たいです!
編集:これが安全なことであると信じる理由を説明する必要があったほど明確ではなかったようです. もちろん、これが良い方法だとは言いません。
これが安全であると私が考える理由は、PDO (これが間違っている場合は訂正してください) が、置換テキストでサニタイズされたbound-param のテキスト置換を行うためです。直観的に、これは置換テキスト (":id_$id") が任意の値であることを示しているはずです。これは、パラメーターがクエリに配置されたときに PDO によって完全に置き換えられるためです。パラメータの置換にはパラメータの値のサニタイズが含まれるため、「:id_$id」は実行するのが危険な場合がありますが、「$id」(最終クエリに表示されるもの) は安全なはずです。
とにかく、それは私の推論です。私のコードではこれほど危険なことはしていないので、これはより学術的な関心事です。