違いはごくわずかだと考えられています。
それでも、ネイティブのプリペアドステートメントを区別する必要があります プリペアドステートメントの一般的な考え方から。
前者は、ほとんどのDBMSでサポートされているクエリを実行する形式であり、
後者は、実際のデータをプレースホルダーで置き換えるという一般的な考え方であり、置き換えられたデータをさらに処理することを意味します。よく知られているprintf()
であるプログラミングで広く使用されています。 関数は一例です。また、この後者のアプローチは、データベースに対してクエリを実行するために常に使用する必要があります 、ネイティブのプリペアドステートメントに裏打ちされているかどうかは関係ありません。理由:
- プリペアドステートメントにより、適切なフォーマット(または処理)が不可避になります。 。
- プリペアドステートメントは、唯一の適切な場所で適切なフォーマット(または処理)を行います -クエリ実行の直前で、他の場所ではないので、私たちの安全は、
- のような信頼できないソースに依存しません。
- データを安全にするのではなく、データを台無しにするPHPの「魔法」機能。
- プログラムフローのどこかで変数をフォーマットする(またはフォーマットしない)ことを決定できる1人(または複数)のプログラマーの善意。それが非常に重要なポイントです。
- プリペアドステートメントは、クエリに入力される値そのものに影響しますが、ソース変数には影響しません。ソース変数はそのまま残り、以降のコードで使用できます(メールで送信するか、画面に表示されます)。
- プリペアドステートメントを使用すると、アプリケーションコードを大幅に短縮でき、すべてのフォーマットをバックグラウンドで実行できます(*ドライバーが許可する場合のみ)。
したがって、ネイティブのプリペアドステートメントを使用しないことを検討している場合でも(これはまったく問題ありません)、実際のデータではなく、常にプレースホルダーを使用してクエリを作成する必要があります。この目的のために、PDO を使用できます 、これは上記とまったく同じように機能します。デフォルトでは、 emulate prepares は、準備されたクエリとデータから作成され、データベースに対して実行される通常のSQLクエリを意味します。
ただし、PDOは、識別子や配列などの多くの重要なデータ型をサポートしていません。したがって、プレースホルダーを常に使用できるとは限らないため、インジェクションが非常に可能になります。幸い、 safeMysql すべてのデータ型のプレースホルダーがあり、クエリを安全に実行できます。