プリペアドステートメントがSQLインジェクション攻撃に対する優れた防御策であることはよく知られています。
誰かがこれをそうするバインディングプロセスで何が起こるかを説明できますか?
私の主な混乱は、ステートメントがプレースホルダーを使用し、これらのプレースホルダーが変数に置き換えられているという事実から生じています。したがって、変数に悪意のあるSQLが含まれている場合でも、プレースホルダーの代わりにバインドされますか?
プリペアドステートメントがSQLインジェクション攻撃に対する優れた防御策であることはよく知られています。
誰かがこれをそうするバインディングプロセスで何が起こるかを説明できますか?
私の主な混乱は、ステートメントがプレースホルダーを使用し、これらのプレースホルダーが変数に置き換えられているという事実から生じています。したがって、変数に悪意のあるSQLが含まれている場合でも、プレースホルダーの代わりにバインドされますか?
いいえ、バインディングプロセスは、バインディング値がデータベースに入力される値と1:1で一致することを保証します。
だから、'xxx; ドロップテーブルyyy; ' 値はvarcharフィールドの実際の値になります。パラメータバインディングを使用しない場合、このコードが実行されます。
まず、PDOは、DBエンジンが定数と見なすものをサニタイズします。たとえば、INSERT句の値、WHERE句の比較値などですが、識別子やキーワードなどはサニタイズしません。(補足:動的SQLをサニタイズしないため、動的SQLを使用する場合はPDOのみに依存することはできません)
あなたが尋ねている点について、あなたはどんなパラメータバインディングでもあなたが望む種類のバインディングを提供することに注意するべきです:文字列または数値またはブール値(または他のもの、私は覚えていません)。だから彼の事実は: