6

プリペアドステートメントがSQLインジェクション攻撃に対する優れた防御策であることはよく知られています。

誰かがこれをそうするバインディングプロセスで何が起こるかを説明できますか?

私の主な混乱は、ステートメントがプレースホルダーを使用し、これらのプレースホルダーが変数に置き換えられているという事実から生じています。したがって、変数に悪意のあるSQLが含まれている場合でも、プレースホルダーの代わりにバインドされますか?

4

2 に答える 2

1

いいえ、バインディングプロセスは、バインディング値がデータベースに入力される値と1:1で一致することを保証します。

だから、'xxx; ドロップテーブルyyy; ' 値はvarcharフィールドの実際の値になります。パラメータバインディングを使用しない場合、このコードが実行されます。

于 2012-09-04T20:42:02.013 に答える
1

まず、PDOは、DBエンジンが定数と見なすものをサニタイズします。たとえば、INSERT句の値、WHERE句の比較値などですが、識別子やキーワードなどはサニタイズしません。(補足:動的SQLをサニタイズしないため、動的SQLを使用する場合はPDOのみに依存することはできません)

あなたが尋ねている点について、あなたはどんなパラメータバインディングでもあなたが望む種類のバインディングを提供することに注意するべきです:文字列または数値またはブール値(または他のもの、私は覚えていません)。だから彼の事実は:

  • 宣言された数値およびブールパラメータ値は、PDOがその型への制約を簡単にチェックし、対応するテキストを生成できるため、危険なコードを挿入しません。
  • Null値はNullキーワードに簡単に変換できます。
  • もちろん、矛盾する値は文字列型であり、PDOはここで何をしますか?mysqli::real_escape_stringと同じ方法でサニタイズします。
于 2012-09-04T21:08:27.743 に答える