2011-06-03 9 views
1

LIKEパターンマッチングでクエリに渡されるテキストをエスケープする適切な方法は何ですか? 問題がZend_DbでLIKEの入力をエスケープする

$input = '%sometext'; 

を更新して

select()->where('field LIKE ?', $input . '%'); 

が不正確になることをされています 'に脆弱' -

答えて

0

'が正しくない'>それは脆弱性ではないのですが、それを何ですか?それは有効なコンテンツです。それは(WHERE user LIKE '%admin%'のような)アプリケーションに脆弱性を提起した場合、あなたのようなSTH使用して入力自分をフィルタリング/検証を考慮する必要があります。

if (strpos('%', $input)){ 
    $input = strtr($input, '%', ''); 
} 
+0

OKを、多分「脆弱」は正しい言葉ではないですが、私はよりよいが「正しくない」ことだと思います(質問で更新された)。 問題は、ユーザーが「100%確実」というテキストを検索したい場合、「100マイル離れた、確かに」という結果を受け取ることです(単なる例)。これはまさにユーザーが見たいものではありません。 さらに、SQLのさまざまな方言で特別な文字があります。ですから、特別なシンボルを置き換えることはあまり良くないと思うので、MySQLでハードコーディングするとORMの全体が失われてしまいます。 – eater

+0

だから、DBLayerは「100%」と「100(。*)」を検索するかどうかを決定する必要がありますか? –

+0

私は、DB層は、LIKEクエリに渡される入力をエスケープするメソッドを持たなければならないと思います。 MySQLではそれは簡単です \t addcslashes($ str、 '_%'); しかし、異なるDBの特殊文字のセットは異なることがあり、各DBのこの種の機能を持つことは素晴らしいでしょう(アダプタでは、私は思っています)。 F.e. MSSQLのLIKEクエリでは、文字のリストと一致させるために[a = z]を含めることができます。適切なエスケープがなければ、 '[10]'を含む文字列を検索することは不可能です。 – eater

関連する問題