まず第一に: mysql_escape_string は非推奨なので使用せず、代わりに mysql_real_escape_string を使用してください。
mysql_real_escape_string と addslashes の違いは次のとおりです:
違い 1:
addslashes は MySQL 接続の文字セットについて何も知りません。使用している MySQL 接続以外のバイト エンコーディングを含む文字列を渡すと、値が文字 '、"、および x00 であるすべてのバイトが問題なくエスケープされます。8 ビットの他の文字と異なり、 UTF-8 では、これらのバイトの値は必ずしもすべて文字 '、"、および x00 で表されるわけではありません。考えられる結果は、MySQL がこれらの文字を受け取った後にエラーが発生することです。
このバグを修正したい場合は、iconv 関数を使用して変数を UTF-16 に変換し、addslashes を使用してエスケープしてみてください。
これが、エスケープにアッドスラッシュを使用しない理由の 1 つです。
違い 2:
addslashes と比較して、mysql_real_escape_string は r、n、x1a もエスケープします。これらの文字は MySQL に正しく伝える必要があるようです。そうしないと、間違ったクエリ結果が得られます。
これが、エスケープにアッドスラッシュを使用しないもう 1 つの理由です。
addslashes 対 mysql_real_escape_string
GBK では、0xbf27 は有効な複数文字文字ではありませんが、0xbf5c は有効です。シングルバイト環境では、0xbf27 は 0xbf の後に 0x27(‘) が続くものとして扱われ、0xbf5c は 0xbf の後に 0x5c() が続くものとして扱われます。
バックスラッシュでエスケープされた一重引用符は、MySQL に対する SQL インジェクション攻撃を効果的に防ぐことはできません。もしあなたがaddslashesを使ってくれたら、私(攻撃者、以下同じ)は非常に幸運です。 0xbf27 のようなものを挿入し、それを 0xbf5c27 (有効なマルチバイト文字とその後に一重引用符が続く) にスラッシュを追加します。言い換えれば、エスケープに関係なく、単一引用符を正常に挿入できます。これは、0xbf5c が全角文字ではなく半角文字として扱われるためです。
このデモでは、MySQL 5.0 と PHP 用の mysqli 拡張機能を使用します。試してみたい場合は、必ず GBK を使用してください。
users という名前のテーブルを作成します:
http://www.bkjia.com/PHPjc/759336.html