ユーザーが検索でワイルドカードとしてアスタリスク(*)を使用できるようにする必要があります。
アスタリスクを%に変換し、SQLクエリでLIKEを使用するのは安全ですか?
user-regexpを使用すると、計算に永遠にかかる通常の表示が発生する可能性があることを私は知っています。この場合、私は可能だとは思いませんが、これを行うことで他のセキュリティ上の問題がありますか?
式にワイルドカードをlike
使用すると、クエリの実行が変更され、RDBMSがインデックスを使用する代わりに全表スキャンを使用するようになる可能性があります。これにより、データが多い場合にクエリの速度が低下する可能性があります。最初のアスタリスクの前に少なくともいくつかの非ワイルドカード文字が存在するかどうか、ユーザーの入力を確認することをお勧めします。
また、に変換*
して%
を使用する場合は、同様にLIKE
注意する必要があることに注意してください。そうしないと、アンダースコアだけでなく、任意の1文字に一致します。_
あなたがしているのがそのような単純な交換だけであるなら
str_replace('*','%',$query)
そうすれば、私はセキュリティ上の懸念を予見しません。それはあなたが懸念していることだと私は信じています。SQLインジェクションの可能性などを開くことはありません(少なくともこの置換を行うことによって、入力をエスケープしない場合でもセキュリティ上の懸念がある可能性があります)。
ただし、他のユーザーが指摘しているように、パフォーマンスの問題が発生する可能性があります。ちょうど検索するとどうなり*
ますか、テーブル全体を取り戻すつもりですか?最善の方法(データベース検索エンジンを使用したくない場合)は、ユーザー検証を行うことです。ほとんどの場合、クエリで全表スキャンを防止したい場合は、ユーザーが先頭または末尾のワイルドカードのみを実行するように制限する必要があります。
良い:
*foo
bar*
あまり良くない:
*foo*
ba*r
ただし、実際には、行数と、ユーザーが実際の入力を提供することをどれだけ信頼できるかによって異なります。
本当の問題は、ユーザーにクエリの一部を決定させるのが安全かどうかです。
単純な場合でも、データベースにユーザーデータを提供することは安全ではありません。
ユーザー入力をデータベースに直接提供できるようにすることは危険かもしれませんが、フィルターを使用してデータベースエスケープ戦略を使用する限り(つまり、mysql_real_escape_string()
(十分に準備されたステートメントまたは任意のORMがそれを実行します)十分に安全である必要があります。
ただし、パフォーマンスの問題が発生する可能性がありEXPLAIN
ます。クエリを実行するだけで、RDBMSエンジンによってスキャンされる行数について警告が表示されます。
このような機能を実装する最良の方法は、検索エンジンを使用することです。(それはあなたがやろうとしていることではありませんか?)
これを実装するのに役立つ多くの選択肢があります。
Sphinx、Solr、Xapian、さらにはLuceneをご覧ください。すべての優れた選択肢があります。
基本的に、コンテンツを「インデックス付け」して、パフォーマンスを向上させながら全文検索を行うことができます。
それらはまた、、、、、などのようないくつかの信じられないほどの機能を与えることができます。OR
コンパレータ/演算子。AND
LIKE
MINUS
次に、この質問に興味があるかもしれません:スタンドアロンの全文検索サーバーの選択:SphinxまたはSOLR?