3

明らかに、インデックスをゴミ箱に入れたり、カード番号やパスワードなどを解読したりするために使用することはできません(カード番号やパスワードをインデックスに入れるほど愚かでない限り)。

過度に複雑な検索でサーバーを停止することは可能ですか?

私が本当に知る必要があるのは、ユーザーが入力したLuceneクエリを、サニタイズせずに検索エンジンに直接渡して、悪意から安全にできるかどうかだと思います。

4

2 に答える 2

5

クエリパーサーの入力からインデックスを変更することはできません。ただし、Luceneを実行している検索サーバーに損害を与える可能性のあるものがいくつかあります。

  • 収集する上位の結果の数の値が高い

Luceneは、ヒットを優先キューに入れて順序付けします(これは、優先キューのサイズのバッキング配列で実装されます)。したがって、オフセット99999900からオフセット100000000までの結果をフェッチするリクエストを実行すると、サーバーはこの優先キューに数百メガバイトを割り当てます。この種のクエリをいくつか並行して実行すると、サーバーのメモリが不足する可能性があります。

  • 任意のフィールドでの並べ替え

フィールドで並べ替えるには、このフィールドのフィールドキャッシュをロードする必要があります。この操作は、多くの時間がかかることに加えて、多くのメモリを使用し(特に、大きな個別の値が多数あるテキストフィールドで)、このキャッシュがロードされたインデックスリーダーが読み込まれるまで、このメモリは再利用されません。もう使用されていません。

  • 用語辞書を多用するクエリ

一部のクエリは他のクエリよりも高価です。クエリの実行に時間がかかりすぎるのを防ぐために、Luceneには、複雑すぎるクエリに対するいくつかのガードがすでにあります。デフォルトでは、BooleanQueryに1024を超える句を含めることはできません

ワイルドカードクエリやファジークエリなどの他のクエリも非常にコストがかかります。

ユーザーが検索サービスを傷つけないようにするには、ユーザーに許可することと許可しないことを決定する必要があります。たとえば、Twitter(検索バックエンドにLuceneを使用)は、妥当な時間内に確実に応答を提供するために、クエリをいくつかの句に制限するために使用されていました。(この質問Twitter api-検索が複雑すぎますか?この制限について話します)

于 2012-04-10T16:16:18.663 に答える
1

私の知る限り、心配する必要のある大きな脆弱性はありません。使用しているクエリパーサーによっては、簡単なサニタイズを実行することをお勧めします。

  • クエリ文字列の長さを制限する
  • サポートしたくない文字を確認してください。たとえば、+、-、[、]、*
  • 返される結果の数(10、20、50など)をユーザーに選択させる場合は、実際に大きな値を使用できないようにしてください。
于 2012-04-10T15:59:48.113 に答える