mysql_real_escape_string() による MySQL インジェクションの脆弱性
mysql_real_escape_string() は広く使用されているにもかかわらず、特定の状況下では SQL インジェクション攻撃を完全に防御できない可能性があります。
アジアの文字エンコーディング
JustinShattuck.com によると、中国語 Big5 文字を使用した例で示されているように、特定のアジアの文字エンコーディングは mysql_real_escape_string() をバイパスできます。この脆弱性は、
- mysql_real_escape_string() が使用されている場合に発生します。
- SET NAMES を使用して、デフォルトの文字エンコーディングをマルチバイト エンコーディングに切り替えることができます。
- 選択されたマルチバイトエンコードでは、2 番目、3 番目、またはそれ以降のバイトとしてバックスラッシュ ("") を使用できます。
影響と緩和
Stefan Esser が説明しているように、この脆弱性は、mysql_real_escape_string() が考慮されていないために発生します。 SET NAMES によってエンコードが変更されます。この問題に対処するには:
-
準備されたステートメントを優先します: 準備されたステートメントは文字エンコーディングを正しく処理し、一般的により安全です。
-
mysql_set_charset を使用します (使用可能な場合) ): この新しい関数により、mysql_real_escape_string() に存在する脆弱性なしで安全にエンコードを変更できます。
-
文字エンコード オプションを制限する: アプリケーションで使用できる文字エンコードを制限します。脆弱性を防止します。
-
UTF-8 には注意してください: UTF-8 は一般に安全ですが、悪意のあるユーザーがエッジ ケースを悪用しようとする可能性があるため、監視する必要があります。
以上が質疑応答形式を念頭に置き、核心的な問題を強調したタイトルのオプションをいくつか示します。
オプション 1 (直接的かつ具体的):
* mysql_real_escape_string() は SQL Inj から保護できますかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。