を使用して、 mysql_real_escape_string()
の mysql_real_escape_stringのsqlインジェクションをバイパスするために、文字エンコードの問題を使用します。
functionがSQLインジェクションを防止しますが、特定の場合にバイパスされる可能性があります。
$login = mysql_real_escape_string(GetFromPost('login'));
$password = mysql_real_escape_string(GetFromPost('password'));
$sql = "SELECT * FROM table WHERE login='$login' AND password='$password'";
$ login = mysql_real_escape_string(getFrompost( 'login'));
$ password = mysql_real_escape_string(getFrompost( 'password'));
$ sql = "select * from where where login = '$ login'およびpassword = '$ password'";
このコードは安全だと思われますが、文字セットのエンコードのエッジケースのために悪用される可能性があります。
攻撃方法:
call
mysql_real_escape_string():クライアントは、接続が別の文字セットを使用すると考えています(たとえば、latin1)。引用符の前にバックスラッシュを挿入して、構文的に有効な文字列になります。
動作原則:
重要な問題は、サーバーが期待する文字セットがクライアントが考慮した文字セットと一致しないことです。 mysql_real_escape_string()は、クライアントが設定した接続エンコードに基づいて逃げられますが、場合によっては、
set name の代わりに
セット名を使用するなど、無効なマルチバイト文字を単一のバイトとして扱います。 mysql_set_charset()
ケース。
の結果として:
この攻撃は、シミュレートされた前処理ステートメントが無効になっている場合でも、PDOのシミュレートされた前処理ステートメントをバイパスできます。
Remedy:
この問題を軽減するには、UTF8MB4やUTF8などの非妨害文字セットを使用します。 no_backslash_escapes sqlモードを有効にすることも保護を提供します。
安全な例:
は、 mysql_set_charset()
またはPDOのDSN文字セットパラメーターを使用して、常に正しく設定されている文字を設定します。 MySqliの実際の前処理ステートメントもこの攻撃の影響を受けません。
結論は:
mysql_real_escape_string()
は通常強力な保護を提供しますが、SQL注入に対する完全な防御を確保するために、このような潜在的なエッジのケースに注意することが重要です。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3