ホームページ > データベース > mysql チュートリアル > 文字エンコーディングの問題により、SQL インジェクションは「mysql_real_escape_string()」をバイパスできますか?

文字エンコーディングの問題により、SQL インジェクションは「mysql_real_escape_string()」をバイパスできますか?

Barbara Streisand
リリース: 2025-01-25 21:22:12
オリジナル
424 人が閲覧しました

Can SQL Injection Bypass `mysql_real_escape_string()` Due to Character Encoding Issues?

文字コーディングの問題を使用してバイパス

SQLインジェクション関数はSQL注射を防ぐことができますが、特定の場合にはバイパスされる場合があります。 mysql_real_escape_string() 次のPHPコードを検討してください:

mysql_real_escape_string()このコードは安全であるように見えますが、文字セットのエンコーディングのエッジのために使用される場合があります。

攻撃方法:

<code class="language-php">$login = mysql_real_escape_string(GetFromPost('login'));
$password = mysql_real_escape_string(GetFromPost('password'));

$sql = "SELECT * FROM table WHERE login='$login' AND password='$password'";</code>
ログイン後にコピー

次の手順への攻撃依存:

文字セットを設定します。コーディングを選択します(たとえば、GBK)。

効果的な負荷:>有効な負荷は慎重に構築されています。これには、無効なマルチバイト文字が含まれて、最後のバイトがASCIIバックリックスを表すことを確認します。

    call クライアントは、接続が異なる文字セット(LATIN1など)を使用すると考えているため、は単一の引用番号の前にバックスロープを挿入します。文法の有効妥当性文字列を生成します。
  1. クエリを送信:正義がSQLステートメントの一部になった後の有効な負荷により、攻撃者は予想される保護の保護をバイパスできます。
  2. 作業原則: mysql_real_escape_string() 重要な問題は、サーバーの期待の文字セットが、クライアントが考える文字セットと一致しないことです。クライアントによって設定された接続コーディングは、正義を作るために使用されますが、場合によっては、無効なマルチライン文字をmysql_real_escape_string()ではなく
  3. の使用を含む単一のバイトとして扱います。
  4. 結果:
シミュレーション前処理ステートメントが無効になっている場合でも、この攻撃はPDOのシミュレーション前処理ステートメントをバイパスできます。

救済策:

UTF8MB4やUTF8などの非攻撃文字を使用すると、この問題を軽減できます。 no_backslash_escapes SQLモードを有効にすることも保護を提供できます。

mysql_real_escape_string()安全な例:SET NAMESmysql_set_charset()

常にまたはPDO DSN文字セットパラメーターを使用して、文字セットを正しく設定します。 Mysqliの実際の処理ステートメントもこの攻撃の影響を受けません。

結論:

通常、強力な保護を提供しますが、包括的な防衛SQL注入を確保するために、そのような潜在的なマージンに注意を払う必要があります。

以上が文字エンコーディングの問題により、SQL インジェクションは「mysql_real_escape_string()」をバイパスできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート