明らかに、インデックスをゴミ箱に入れたり、カード番号やパスワードなどを解読したりするために使用することはできません(カード番号やパスワードをインデックスに入れるほど愚かでない限り)。
過度に複雑な検索でサーバーを停止することは可能ですか?
私が本当に知る必要があるのは、ユーザーが入力したLuceneクエリを、サニタイズせずに検索エンジンに直接渡して、悪意から安全にできるかどうかだと思います。
明らかに、インデックスをゴミ箱に入れたり、カード番号やパスワードなどを解読したりするために使用することはできません(カード番号やパスワードをインデックスに入れるほど愚かでない限り)。
過度に複雑な検索でサーバーを停止することは可能ですか?
私が本当に知る必要があるのは、ユーザーが入力したLuceneクエリを、サニタイズせずに検索エンジンに直接渡して、悪意から安全にできるかどうかだと思います。
クエリパーサーの入力からインデックスを変更することはできません。ただし、Luceneを実行している検索サーバーに損害を与える可能性のあるものがいくつかあります。
Luceneは、ヒットを優先キューに入れて順序付けします(これは、優先キューのサイズのバッキング配列で実装されます)。したがって、オフセット99999900からオフセット100000000までの結果をフェッチするリクエストを実行すると、サーバーはこの優先キューに数百メガバイトを割り当てます。この種のクエリをいくつか並行して実行すると、サーバーのメモリが不足する可能性があります。
フィールドで並べ替えるには、このフィールドのフィールドキャッシュをロードする必要があります。この操作は、多くの時間がかかることに加えて、多くのメモリを使用し(特に、大きな個別の値が多数あるテキストフィールドで)、このキャッシュがロードされたインデックスリーダーが読み込まれるまで、このメモリは再利用されません。もう使用されていません。
一部のクエリは他のクエリよりも高価です。クエリの実行に時間がかかりすぎるのを防ぐために、Luceneには、複雑すぎるクエリに対するいくつかのガードがすでにあります。デフォルトでは、BooleanQueryに1024を超える句を含めることはできません。
ワイルドカードクエリやファジークエリなどの他のクエリも非常にコストがかかります。
ユーザーが検索サービスを傷つけないようにするには、ユーザーに許可することと許可しないことを決定する必要があります。たとえば、Twitter(検索バックエンドにLuceneを使用)は、妥当な時間内に確実に応答を提供するために、クエリをいくつかの句に制限するために使用されていました。(この質問Twitter api-検索が複雑すぎますか?この制限について話します)
私の知る限り、心配する必要のある大きな脆弱性はありません。使用しているクエリパーサーによっては、簡単なサニタイズを実行することをお勧めします。