ホームページ >バックエンド開発 >PHPチュートリアル >安全な SQL クエリのために MySQL ワイルドカードをエスケープするにはどうすればよいですか?
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 つのレベルが含まれます:
例で示すように、特に 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 サイトの他の関連記事を参照してください。