厳密に言えば、パラメータ値がクエリ文字列に補間されることはないため、実際にはエスケープは必要ありません。
クエリパラメータが機能する方法は、prepare()
を呼び出したときにクエリがデータベースサーバーに送信されることです。 、およびパラメータ値は、後でexecute()
を呼び出したときに送信されます。 。したがって、これらはテキスト形式のクエリとは別に保持されます。 SQLインジェクションの機会はありません(PDO::ATTR_EMULATE_PREPARES
が提供されます) は偽です。
そうです、クエリパラメータは、そのような形式のセキュリティの脆弱性を回避するのに役立ちます。
それらはセキュリティの脆弱性に対して100%の証拠ですか?いいえ、もちろん違います。ご存知かもしれませんが、クエリパラメータはSQL式の単一のリテラル値の代わりになります。値のリストの代わりに単一のパラメータを作成することはできません。例:
SELECT * FROM blog WHERE userid IN ( ? );
パラメータを使用してテーブル名または列名を動的にすることはできません:
SELECT * FROM blog ORDER BY ?;
他のタイプのSQL構文にパラメーターを使用することはできません:
SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;
そのため、prepare()
の前に、クエリを文字列として操作する必要がある場合がかなりあります。 電話。このような場合でも、SQLインジェクションを回避するために慎重にコードを記述する必要があります。