ホームページ >バックエンド開発 >PHPチュートリアル >安全な SQL クエリのために MySQL ワイルドカードをエスケープするにはどうすればよいですか?

安全な SQL クエリのために MySQL ワイルドカードをエスケープするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-09 10:03:02217ブラウズ

How to Escape MySQL Wildcards for Secure SQL Queries?

MySQL ワイルドカードのエスケープ: 総合ガイド

MySQL 環境で信頼できないユーザー入力を扱う場合、特殊文字をエスケープすることが重要です。 SQL インジェクション攻撃を防ぎます。この目的には、PHP 関数 mysql_real_escape_string がよく使用されます。ただし、MySQL ワイルドカード "%" および "_" はエスケープされません。

この問題に対処するために、一部のユーザーは、addcslashes を使用してこれらのワイルドカードを手動でエスケープすることに頼っています。ただし、このアプローチでは、次の例に示すように、予期しない結果が生じる可能性があります。

Input: test_test " '
Database: test\_test " '

ここで、アンダースコア ("_") は、一重引用符 ("'" とは異なり、前にバックスラッシュを付けてエスケープされます) ) と二重引用符 (""")。これらの文字はすべてバックスラッシュ文字を使用してエスケープされるため、この動作は混乱を招く可能性があります。

この現象を理解するには、MySQL のワイルドカード エスケープ メカニズムをさらに深く掘り下げる必要があります。「_」と「%」 " は一般的な MySQL の使用法ではワイルドカードとして扱われないため、通常の文字列リテラルを構築するときにエスケープすべきではありません。mysql_real_escape_string はこの状況を正しく処理します。

ただし、"%_" は LIKE マッチングのコンテキストでのみ特殊文字になります。 LIKE ステートメントでリテラルに使用する文字列を準備するには、パラメータ化されたクエリを使用する場合でも LIKE エスケープを実行する必要があります。

LIKE エスケープには 2 つのレベルが含まれます:

  1. LIKE エスケープ: _ と % は特別であり、エスケープする必要があります。エスケープ文字 () もエスケープする必要があります。
  2. 文字列リテラル エスケープ: LIKE エスケープ後、mysql_real_escape_string () を使用してプレーン文字列リテラル エスケープを実行します。

例で示すように、特に PHP の文字列リテラルを使用している場合、二重バックスラッシュ エスケープの可能性が問題になる可能性があります。

>

これらの複雑さを回避し、移植性を確保するには、デフォルトの (間違った) LIKE エスケープ動作をオーバーライドし、LIKE ... ESCAPE ... 構造を使用してカスタム エスケープ文字を指定することを検討してください。

// function that performs LIKE escaping
function like($s, $e) {
    return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s);
}

その後

$escapedname = mysql_real_escape_string(like($name, '='));
$query = "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";

これらの推奨事項に従うことで、MySQL ワイルドカードを効果的にエスケープし、データベース アプリケーションのセキュリティを強化できます。

以上が安全な SQL クエリのために MySQL ワイルドカードをエスケープするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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