データベース挿入時の MySQL 特殊文字のエスケープ
ユーザー入力を MySQL データベースに挿入する場合、特殊文字を適切にエスケープして潜在的な脆弱性を防ぐことが重要です文字。 PHP 関数 mysql_real_escape_string はこのタスクを効果的に処理しますが、MySQL ワイルドカード % および _ をエスケープしません。
これに対処するために、多くの開発者は、addcslashes 関数を mysql_real_escape_string と組み合わせて使用し、これらのワイルドカードもエスケープします。ただし、このアプローチは予期しない結果につながる可能性があります。
MySQL でのワイルドカード エスケープについて
一般的な考えに反して、MySQL では一般文字列の _ と % はワイルドカードとみなされません。リテラル。これらは、パターン マッチングの LIKE ステートメントで使用される場合にのみエスケープする必要があります。
エスケープの階層
LIKE ステートメントのコンテキストでの特殊文字のエスケープには、次の 2 つのレベルが含まれます。
二重バックスラッシュの混乱
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 サイトの他の関連記事を参照してください。