ホームページ >バックエンド開発 >PHPチュートリアル >mysql_real_escape_string() は本当に安全ですか?アジアの文字エンコーディングの潜在的な落とし穴。

mysql_real_escape_string() は本当に安全ですか?アジアの文字エンコーディングの潜在的な落とし穴。

DDD
DDDオリジナル
2024-10-26 15:02:02694ブラウズ

 Is mysql_real_escape_string() Really Safe? The Potential Pitfall with Asian Character Encodings.

SQL インジェクションからの保護: mysql_real_escape_string() の制限

mysql_real_escape_string() は SQL インジェクションを防ぐために一般的に使用されますが、プリペアドステートメントを使用しない Web サイトでは、特定のアジア文字エンコーディングを使用してバイパスできると主張しました。

バイパスの問題

Justin Shattuck によると、バイパスは次のとおりです。 Big5 または GBK 文字エンコーディングの文字を使用することで可能になります。これらのエンコーディングではバックスラッシュを 2 番目以上のバイトとして表現できるため、mysql_real_escape_string() が混乱してバックスラッシュを適切にエスケープできなくなる可能性があります。

Stefan Esser の説明

Stefan Esser 氏この脆弱性は、mysql_real_escape_string() が、エンコーディングを切り替える可能性がある SET NAMES を通じて行われた変更を認識しないために発生します。マルチバイト エンコーディングが使用される場合、バックスラッシュは複数バイトとして表現される可能性があり、エスケープ プロセスがバイパスされる可能性があります。

UTF-8 は安全ですか?

Esser は次のように述べています。 UTF-8 は、どのバイト位置でもバックスラッシュを正しく処理するため、この問題の例外です。ただし、エンコードを変更するには、より安全で新しいオプションである mysql_set_charset を使用することをお勧めします。

推奨事項

SQL インジェクションから完全に保護するには、prepared を使用することをお勧めします。ステートメントは、このバイパスの問題の影響を受けません。プリペアドステートメントがオプションでない場合は、次の点を考慮する必要があります:

  • mysql_real_escape_string() で SET NAMES の使用を避ける
  • 必要に応じて mysql_set_charset を使用してエンコーディングを変更する
  • このバイパスに対して脆弱ではないため、UTF-8 エンコーディングを使用してください

以上がmysql_real_escape_string() は本当に安全ですか?アジアの文字エンコーディングの潜在的な落とし穴。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。