SQL インジェクションのバイパス mysql_real_escape_string()
SQL インジェクションを防ぐには mysql_real_escape_string() を使用するだけで十分であると広く信じられていますが、この防御をバイパスできるシナリオが存在します。 .
攻撃Vector
そのような攻撃の 1 つは、特定の条件の組み合わせを伴います:
- 脆弱な文字エンコーディング (gbk、cp932 など) の使用
- 接続文字セットの誤った設定クライアント上
- 無効なマルチバイト文字が単一文字として扱われるエッジケースを悪用するエスケープするためのバイト数
攻撃プロセス
- データベース接続を確立し、サーバーの文字エンコーディングを脆弱なものに設定します (例: 'SET NAMES gbk')。
- 無効なマルチバイト文字シーケンスを含むペイロードを構築すると、シングルバイトとして誤って解釈されます。 ('xbfx27 OR 1=1 /*')。
- mysql_real_escape_string() を使用してペイロードを「エスケープ」します。これにより、アポストロフィの前にバックスラッシュが誤って挿入されます。
- 次を使用して SQL クエリを実行します。エスケープされたペイロードは、意図されたものを効果的にバイパスします
脆弱なシナリオ
この攻撃は、特に次のシナリオで懸念されます:
- 4.1.20、5.0.22 より前の MySQL バージョンを使用している、または 5.1.11
- 準備されたステートメントのエミュレーション5.3.6 より前のバージョンの PDO では
軽減戦略
この脆弱性を軽減するには、次のことが重要です:
- MySQL バージョン 5.1 以降を使用する
- を使用して接続文字セットを適切に設定します。 mysql_set_charset() または同等のもの
- 5.3.6 より前の PDO バージョンでエミュレートされたプリペアド ステートメントを無効にする
- utf8mb4 や utf8 などの脆弱性のない文字エンコーディングの使用を検討する
結論
しながらmysql_real_escape_string() は SQL インジェクションに対する重要な保護を提供しますが、絶対確実というわけではありません。データベース アプリケーションのセキュリティを確保するには、潜在的なバイパス メカニズムを理解し、対処することが重要です。
以上がmysql_real_escape_string() はバイパスできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。