2013-05-01 15 views
7

まず、ストアドプロシージャを使用してクエリを再利用し、エスケープ処理を行うようにします。しかし、私は多くの開発者がmysqli_real_escape_stringはSQLインジェクションを100%防ぐことはできないと言っています。誰かがこれの例を提供してもらえますか?私はmysqli_real_escape_string常に文字列のためではなく、あなたが番号を確認しない限り見破らすることができ、数値の罰金だろうと言う主題に関する私の限られた知識からmysqli_real_escape_stringがSQLインジェクションを防止できないのはなぜですか?

はint型、float型、ダブル、など

です

編集:重要なものを追加するのを忘れてしまった:文字セットがUTF8で、mysqli_set_charsetがそれに応じて呼び出されたと仮定します。私が見た唯一の注入は、少数の文字セットに依存しています(どれもUTF8ではありません)。

+6

[周りmysql_real_escape_stringの取得したSQLインジェクション()]( http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) –

+0

リンクの+1、JW。 –

+0

リンクの回答は私の好みにあまりにも派手です。 –

答えて

6

mysqli_set_charset()を使用してクライアントのエンコーディングを設定し、mysqli_real_escape_string()を使用して文字列のみをとフォーマットすると、完全に安全です。代わりに、舞台裏のが

、あなたの質問は、右のアプリケーションコードでこの機能を使用して暗黙の場合は、をエスケープんPDOのquote()様機能(の形でプレースホルダベースのクエリのか、少なくとも処理とを一度に引用しています)。

それは問題であること自体が機能していないが、それが使用されている方法:

  • それが必要なフォーマットの唯一一部、1は簡単に別の部分を忘れて、トラブルに陥ることができないよう
  • 文字列ではなく、まったくエスケープしない別の文字列を書式設定するのは簡単に誤用される可能性があります。
  • 2番目に、アプリケーションコード内で正しく使用されていると、開発者にすべてのリテラルを適切かつ確実に書式設定させる方法がないため、使用方法が矛盾したり、時折発生することがあります。これはまた、不正確さおよび注入をもたらすことがある。 あなたは常に(mysqli_real_escape_stringはすべての権利、このプレースホルダを処理するために使用することができるが)クエリでデータを表現するために、プレースホルダを使用する必要が理由です

+0

二重引用符で囲まれたリテラルを使用すると、 'NO_BACKSLASH_ESCAPES'モードが再起動されます(http://stackoverflow.com/a/23277864)。 – eggyal

関連する問題