2011-01-03 5 views
1

を逃れるために、私は現在、このような(JDBCを使用して)、クエリと私のデータベースを検索しています:それは同様にSQLインジェクションが可能になりますのでは、MySQLを使用して検索:どのようにワイルドカード

"... AND LCASE(Items.Name) LIKE '%" + searchString.toLowerCase() + "%';" 

、これは、明らかに非常に悪いです%や_のようなワイルドカード記号を挿入します。

私の質問は、searchStringにこれらの文字が含まれていても、文字通り扱われるようにするにはどうすればよいですか?

+0

おそらくEscapeProcessorまたは独自のカスタムクラスを使用してエスケープする必要があります(http://en.wikipedia.org/wiki/Escape_character)。 – Eugene

答えて

6

まず、LCASELIKEを使用しないでください。大文字と小文字を区別するロケール(MySQLではデフォルトではありません)を使用している場合を除きます。

これらの文字をエスケープする場合は、\文字の接頭辞を付けてください。foo%barfoo\%barになります。

(私がJavaの使用してきたので、しばらくして、しかしだかもしれません。この作品:)

searchString.replaceAll('%', '\\\\%').replaceAll('_', '\\\\_') 

(または正規表現を使用して):

Regex r = new Regex('(?:%|_)', '\\\\$&'); 
r.replaceAll(searchString) 

限りSQLインジェクションを防ぎます、

WHERE LCASE(Items.Name) LIKE ? 

をなどバインド文字列を作成:普通として変数をバインド

+0

優秀な回答良い先生、私はドキュメントを確認しましたが、これは投稿する前にやっていたはずですが、最終的にはこの解決策に到着するまでは軌道に乗っていました。再度、感謝します! – DanielGibbs

+1

searchString.replaceAll( "%"、 "\\\\%")。replaceAll( "_"、 "\\\\ _");それは正規表現パーサーもまた通過するので、非常に多くのバックスペースが必要です。 – DanielGibbs

1

thisによると、あなたは、スラッシュ(\)を使用して、それらをエスケープすることができたり、独自のエスケープ文字を指定することで:

"... AND LCASE(Items.Name) LIKE '%" + searchString.toLowerCase() + "%' ESCAPE '/';" 

をあなたは、検索を行うとMySQL上でLIKEワイルドカード記号を交換する必要がありますあなたの言語(Java?)、%および_をそれぞれ\%および\_に置き換えてください。上で言及した他のパターンマッチは、(リンクされたドキュメントに従って)サポートされていません。

+0

ありがとう、それは今すべてうまく動作しています。そして私はドキュメントをチェックして、他のパターンマッチを削除しました。 – DanielGibbs