MySQL ワイルドカードのエスケープに 2 つのバックスラッシュが必要なのはなぜですか?

Susan Sarandon
リリース: 2024-11-12 11:22:02
オリジナル
799 人が閲覧しました

Why Does Escaping MySQL Wildcards Require Double Backslashes?

MySQL ワイルドカードのエスケープ: 二重エスケープの難題を理解する

PHP でユーザー入力を操作し、MySQL データベースに接続する場合、特殊なエスケープを行う文字は悪意のある入力を防ぐために非常に重要です。従来、この目的には PHP の mysql_real_escape_string() 関数が使用されてきましたが、MySQL のワイルドカードである % や _ などの文字が欠落しています。その結果、多くの開発者は、これらの文字もエスケープするために addcslashes を使用することに頼っています。

しかし、addcslashes の予期しない動作には疑問が生じます。 _ はバックスラッシュでエスケープするのに、" や ' ではエスケープしないのはなぜですか? この記事では、MySQL ワイルドカード エスケープの微妙な違いを詳しく調べ、それらを正しく処理するための解決策を探ります。

LIKE についてエスケープ

他のワイルドカード文字とは異なり、% と _ は標準の MySQL 文字列リテラルのワイルドカードではありません。LIKE マッチングのコンテキストでのみ特殊文字になります。LIKE の文字列を準備するためです。パラメータ化されたクエリを使用する場合でも、LIKE エスケープとして知られる追加のエスケープ層が必要です。

LIKE エスケープでは、エスケープ文字自体 (通常はバックスラッシュ) と一緒に _ と % をエスケープする必要があります。ただし、標準 SQL とは異なり、MySQL はリテラルのバックスラッシュ エスケープ (文字列リテラル内) と LIKE エスケープの両方にバックスラッシュを使用します。

二重エスケープとバックスラッシュの問題

このようにバックスラッシュを二重に使用すると、混乱を招く二重エスケープ シナリオが作成されます。たとえば、リテラルのパーセント記号 (%) と一致させるには、LIKE 'something\%' を使用してバックスラッシュを二重にエスケープする必要があります。ただし、これは ANSI SQL によれば誤りであり、データベースによっては問題が発生する可能性があります。

移植可能なソリューション

この問題を解決して移植性を確保するには、 LIKE ... ESCAPE ... 構造を使用して、LIKE 式のデフォルトのエスケープ文字をオーバーライドする必要があります。このアプローチを紹介する関数を次に示します。

function like($s, $e) {
    return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s);
}
ログイン後にコピー

この関数を使用すると、ANSI SQL との互換性を確保しながら、LIKE で使用する文字列をエスケープできます。

結論

MySQL でワイルドカードをエスケープするのは簡単そうに見えますが、二重にエスケープするという難問が混乱を引き起こす可能性があります。 LIKE エスケープの複雑さを理解し、移植可能なソリューションを採用することで、悪意のある入力を効果的に防止し、データベースの整合性を確保できます。

以上がMySQL ワイルドカードのエスケープに 2 つのバックスラッシュが必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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