ホームページ >データベース >mysql チュートリアル >データベース挿入時にワイルドカードを含む MySQL 特殊文字を安全にエスケープするにはどうすればよいですか?

データベース挿入時にワイルドカードを含む MySQL 特殊文字を安全にエスケープするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-07 07:11:11664ブラウズ

How Can I Safely Escape MySQL Special Characters, Including Wildcards, for Database Insertion?

データベース挿入時の MySQL 特殊文字のエスケープ

ユーザー入力を MySQL データベースに挿入する場合、特殊文字を適切にエスケープして潜在的な脆弱性を防ぐことが重要です文字。 PHP 関数 mysql_real_escape_string はこのタスクを効果的に処理しますが、MySQL ワイルドカード % および _ をエスケープしません。

これに対処するために、多くの開発者は、addcslashes 関数を mysql_real_escape_string と組み合わせて使用​​し、これらのワイルドカードもエスケープします。ただし、このアプローチは予期しない結果につながる可能性があります。

MySQL でのワイルドカード エスケープについて

一般的な考えに反して、MySQL では一般文字列の _ と % はワイルドカードとみなされません。リテラル。これらは、パターン マッチングの LIKE ステートメントで使用される場合にのみエスケープする必要があります。

エスケープの階層

LIKE ステートメントのコンテキストでの特殊文字のエスケープには、次の 2 つのレベルが含まれます。

  1. LIKE エスケープ: LIKE 内ステートメント、_ および % はエスケープ文字とともにエスケープする必要があります。エスケープ文字自体もエスケープする必要があります。
  2. 文字列リテラル エスケープ: LIKE エスケープ後、文字列は特定のデータベースの要件に基づいて通常の文字列リテラル エスケープを受ける必要があります。 MySQL の場合、これは mysql_real_escape_string を使用して行われます。

二重バックスラッシュの混乱

MySQL は、LIKE エスケープと文字列の両方のエスケープ文字としてバックスラッシュ文字を使用します。文字通りのエスケープ。これは、% を含む文字列を挿入するときに見られるように、混乱を招く可能性があります。 LIKE の目的でエスケープするには二重バックスラッシュを使用する必要があり、その後、文字列リテラルの挿入のために文字列全体を再度エスケープする必要があります。

ANSI SQL およびポータブル LIKE エスケープ

ANSI SQL では、文字列リテラル内のバックスラッシュはリテラルのバックスラッシュを表し、一重引用符は '' を使用してエスケープされると定義されています。ただし、MySQL はこの標準から逸脱しています。移植性を確保するには、MySQL のデフォルトの動作をオーバーライドし、LIKE ... ESCAPE ... 構造を使用してカスタム エスケープ文字を指定することをお勧めします。例:

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 特殊文字を安全にエスケープするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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