sql >> データベース >  >> RDS >> Mysql

エスケープするためだけにプリペアドステートメントを使用する必要がありますか?

    違いはごくわずかだと考えられています。

    それでも、ネイティブのプリペアドステートメントを区別する必要があります プリペアドステートメントの一般的な考え方から。

    前者は、ほとんどのDBMSでサポートされているクエリを実行する形式であり、こちら で説明されています。 。その使用法は疑問視される可能性があります。
    後者は、実際のデータをプレースホルダーで置き換えるという一般的な考え方であり、置き換えられたデータをさらに処理することを意味します。よく知られているprintf()であるプログラミングで広く使用されています。 関数は一例です。また、この後者のアプローチは、データベースに対してクエリを実行するために常に使用する必要があります 、ネイティブのプリペアドステートメントに裏打ちされているかどうかは関係ありません。理由:

    • プリペアドステートメントにより、適切なフォーマット(または処理)が不可避になります。 。
    • プリペアドステートメントは、唯一の適切な場所で適切なフォーマット(または処理)を行います -クエリ実行の直前で、他の場所ではないので、私たちの安全は、
        のような信頼できないソースに依存しません。
      • データを安全にするのではなく、データを台無しにするPHPの「魔法」機能。
      • プログラムフローのどこかで変数をフォーマットする(またはフォーマットしない)ことを決定できる1人(または複数)のプログラマーの善意。それが非常に重要なポイントです。
    • プリペアドステートメントは、クエリに入力される値そのものに影響しますが、ソース変数には影響しません。ソース変数はそのまま残り、以降のコードで使用できます(メールで送信するか、画面に表示されます)。
    • プリペアドステートメントを使用すると、アプリケーションコードを大幅に短縮でき、すべてのフォーマットをバックグラウンドで実行できます(*ドライバーが許可する場合のみ)。

    したがって、ネイティブのプリペアドステートメントを使用しないことを検討している場合でも(これはまったく問題ありません)、実際のデータではなく、常にプレースホルダーを使用してクエリを作成する必要があります。この目的のために、PDO を使用できます 、これは上記とまったく同じように機能します。デフォルトでは、 emulate prepares は、準備されたクエリとデータから作成され、データベースに対して実行される通常のSQLクエリを意味します。

    ただし、PDOは、識別子や配列などの多くの重要なデータ型をサポートしていません。したがって、プレースホルダーを常に使用できるとは限らないため、インジェクションが非常に可能になります。幸い、 safeMysql すべてのデータ型のプレースホルダーがあり、クエリを安全に実行できます。



    1. Oracleは外部キーを取得します

    2. MySQLテーブルに行が存在するかどうかをテストするための最良の方法

    3. カーソルを使用したAndroidのSQliteクエリ

    4. Cakephpの2つのモデル間でテーブルをリンクする