3

たとえば、テキストボックス名を指定すると、ユーザー要件はワイルドカード検索(contains、starts with、ends withなど)を実行できるようにする必要があります。

バックエンド(Java)でパラメーター化されたクエリを使用している限り、SQLワイルドカード文字('%'および'_')を入力として受け入れても大丈夫ですか?事実上、ユーザーが独自の正規表現を作成できるようにします。これは、ユーザーの要件のすべてです。

例:

  1. ユーザーは

    textbox = '%are%'
    
  2. このパラメータは、バックエンドに次のようにフィードされます。

    public class PersonDaoImpl {
    
            public List<Person> search(String name){//name gets the value from textbox w/ sql wildcards
            Query q = mgr.createNativeQuery('select * from Person where name like :name'); //default to always use like since expecting searchkey with sql wildcards    
            q.setParameter('name', name);//gives the input from the screen
            return q.getResultList();
            } 
    }  
    
  3. 結果セットには、ユーザーが正規表現を提供したため、予想どおり、「Waren」、「Jared」、「Clare」、「Blare」という名前のユーザーが含まれます。

SQLパラメータ化クエリを使用すると、SQLインジェクションを許可しないようにすることができます。これはワイルドカード検索のユーザー要件を実装しますが、おそらく私が見逃した可能性のあるものに違反していますか?

更新:Googleがヘルプページからワイルドカードも許可していることがわかりました。

4

3 に答える 3

3

まあ、それはユーザーがSQLの「LIKE」構文を構築する方法を知る(または言われる)必要があるという事実に違反しますが、それだけです。この方法では、通常はインデックスを使用できないという点で、クエリが遅くなる可能性がありますが、セキュリティや正確性については心配していません。

于 2011-10-14T06:19:51.203 に答える
2

これは「安全」ですが、次の2つの理由から、おそらく良い考えではありません。

  1. ユーザーにこのためのSQL構文を知ってもらうことはおそらく最良のUIデザインではありません。
  2. パフォーマンスにとっては恐ろしいことです。これらのクエリはインデックスを使用できないことが多いため、実行に時間がかかります。また、すべてのテキストを比較するために多くのCPU時間を必要とするため、サーバーに多くの負荷(すでに高い実行時間に不釣り合い)が追加されます。代わりにフルテキストインデックスに依存するソリューションが必要です。
于 2011-10-14T06:25:47.530 に答える
0

私は興味があります、nameパラメータはどのようにしてリクエストに設定されるのですか?これはどのプラットフォームですか?(OPはsetParameter以前に逃しました)

%お気づきのとおり、ユーザーはワイルドカード構文、つまり、などの使用法を知っている必要があります_。より一般的なアプローチは、「完全一致」/「starts-with」のオプションとともに、ユーザー名から文字列を取得することです。 /'anywhere-in-name'。そのルートに行くと、最初の2つのケースでより効率的なクエリを実行することもできます。

編集:

顧客がクエリを主張する場合、containsエンドユーザーにパターンの入力を要求する現在のアプローチは、入力文字列をパターンに変換するよりも適切だと思います%

これは、ユーザーが検索文字列にを追加しない(または選択的に追加する)オプションを引き続き使用できるため、%クエリの実行が高速化されるためです。例えば:

  • ユーザーが検索文字列を入力するDonと、クエリは。になりますselect ... from ... where name like 'Don'。RDBMSは、ほとんどの場合、名前のインデックスを使用します。

  • ユーザーが検索文字列を入力するDon%と、クエリは。になりますselect ... from ... where name like 'Don%'。RDBMSは、名前のインデックスを使用する可能性が非常に高くなります。

  • ユーザーが検索文字列を入力する%Don%Don%、インデックスを使用できない場合。

于 2011-10-14T06:26:28.173 に答える