6

重複の可能性:
mysql_real_escape_string VS addlashes

彼らがまったく同じことをしない場合、違いは何ですか?MySQLクエリ内の値の区切り文字'はそうではありませんか?または多分"しかしそれはまたaddslashesで逃げました。

他のデータベースエンジンでは(そして間違いなくPDOのようなdbラッパー内で)理解していますが、なぜ多くの人がaddslashesの代わりにmysql(i)_escape_stringを使用することに熱心なのですか?

4

4 に答える 4

18

まず第一に:使用しないでくださいmysql_escape_string、それは(理由のために)非推奨です!

mysql拡張機能(非推奨)を介してデータベースに接続するレガシーアプリケーションをサポートする必要がある場合は、mysql_real_escape_string代わりにを使用してください。それ以外の場合は、すぐにに切り替えmysqliます。ここで、プリペアドステートメントとバインドされたパラメーターは、ユーザー入力をエスケープするためのより堅牢なメカニズムを提供します。

とはいえ、答えはとの説明を読むことで見つけることができmysql_real_escape_stringますaddslashes

違い#1

addslashesMySql接続エンコーディングについては何も知りません。MySql接続で使用されるエンコーディング以外のエンコーディングを表すバイトを含む文字列を渡すと、文字、、、およびの値を持つすべてのバイトを うまくエスケープします。これは、すべての文字、、、および8ビットエンコーディングとUTF-8以外のエンコーディングを使用している場合と同じではない可能性があります。その結果、MySqlによって受信された文字列が破損します。'"\\x00 '"\\x00

このバグをトリガーするには、を使用iconvして変数をUTF-16に変換してから、でエスケープしてみてaddslashesください。データベースが受け取るものを確認します。

addslashesこれが、エスケープに使用すべきでない理由の1つです。

違い#2

とは対照的にaddslashes、、、、およびのmysql_real_escape_string文字もエスケープします。MySqlと通信するときは、これらの文字もエスケープする必要があるようです。エスケープしないと、不正な形式のクエリが発生する可能性があります\r\n\x1a

addslashesこれが、エスケープに使用すべきでないもう1つの理由です。

于 2010-12-20T00:51:33.067 に答える
5

Chris Shiflettは、SQLを使用してエスケープすることaddslashes()が失敗する実際のケースを示してmysql_real_escape_string()おり、これが唯一の方法です。

これはどのように役立ちますか?MySQLデータベースに対してSQLインジェクション攻撃を試みたい場合、バックスラッシュで一重引用符をエスケープするのは厄介です。ただし、addslashes()を使用している場合は、幸運です。私がする必要があるのは0xbf27のようなものを注入することだけで、addslashes()はこれを0xbf5c27に変更します。これは、有効なマルチバイト文字の後に一重引用符が続きます。言い換えれば、あなたが逃げても、私は一重引用符をうまく挿入することができます。これは、0xbf5cが2文字ではなく1文字として解釈されるためです。おっと、バックスラッシュがあります。

...。

addlashes()を使用しているにもかかわらず、有効なユーザー名またはパスワードを知らなくても正常にログインできます。SQLインジェクションの脆弱性を悪用するだけです。

このタイプの脆弱性を回避するには、mysql_real_escape_string()、プリペアドステートメント、または主要なデータベース抽象化ライブラリのいずれかを使用します。

現在、これは確かにまれなエッジケースですが、データベース固有のエスケープ関数の使用に人々が固執している理由のデモンストレーションです。データベースライブラリだけが、どのような種類のエスケープが必要かを確実に知ることができます。異なるラッパー、文字セット、およびSQLフレーバー(MS SQLサーバーなど)には、異なるエスケープが必要です。その事実を無視することは、脆弱性がどのように生まれるかです。

于 2010-12-20T00:39:30.893 に答える
1

信頼できないデータからSQLを構築するのではなく、プレースホルダーを使用する必要があるため、どちらも使用しないという点で同じです。

正しい方法で行う方法については、http://bobby-tables.com/php.htmlを参照してください。

于 2010-12-20T01:01:24.833 に答える
0

それは何よりも文字セットの問題です。データが純粋にASCIIである場合、SQLコマンドと混合されたデータをエスケープするには何addslashes()で十分でしょうか。ただし、UTF-8エンコーディングのバリエーションに加えて、一部の構成のMySQLでは、UCS2(UTF-16)やGB/Big5中国語文字セットなどのフリンジ文字セットも使用できます。の生のASCIIコードをにエスケープするだけでは不十分です。そして、文字列をエスケープするMySQLの方法は、そもそもSQL標準にあまり準拠していませんでした。MySQLサーバーの将来のリリースで非推奨になる可能性があります。'\'

于 2010-12-20T00:57:44.293 に答える