3

显然,它不能用于破坏索引或破解卡号、密码等(除非有人愚蠢到将卡号或密码放入索引中)。

是否可以通过过于复杂的搜索来关闭服务器?

我想我真正需要知道的是,我是否可以将用户输入的 Lucene 查询直接传递给搜索引擎而不进行清理,并且可以免受恶意攻击。

4

2 回答 2

5

从查询解析器的输入中修改索引是不可能的。但是,有几件事可能会损害运行 Lucene 的搜索服务器:

  • 要收集的顶级结果数量的高值

Lucene 将命中放入优先级队列中以对其进行排序(这是使用优先级队列大小的后备数组实现的)。因此,运行从偏移量 99 999 900 到偏移量 100 000 000 获取结果的请求将使服务器为此优先级队列分配几百兆字节。并行运行多个此类查询可能会导致服务器内存不足。

  • 对任意字段进行排序

对字段进行排序需要加载该字段的字段缓存。除了花费大量时间之外,此操作还将使用大量内存(尤其是在具有大量不同值的文本字段上),并且在已为其加载此缓存的索引读取器被加载之前,不会回收此内存不再使用。

  • 术语字典密集型查询

有些查询比其他查询更昂贵。为了防止查询执行时间过长,Lucene 已经对过于复杂的查询进行了一些防范:默认情况下,一个BooleanQuery 不能超过 1024 个子句

通配符查询和模糊查询等其他查询也非常昂贵。

为防止您的用户损害您的搜索服务,您应该决定他们可以做什么和不可以做什么。例如,Twitter(使用 Lucene 作为其搜索后端)曾经将查询限制在几个子句中,以确保在合理的时间内提供响应。(这个问题Twitter api - search too complex?谈论这个限制)

于 2012-04-10T16:16:18.663 回答
1

据我所知,您无需担心任何重大漏洞。根据您使用的查询解析器,您可能需要进行一些简单的清理。

  • 限制查询字符串的长度
  • 检查您不想支持的字符。例如,+、-、[、]、*
  • 如果您让用户选择返回的结果数(例如 10、20、50),那么请确保他们不能使用非常大的值。
于 2012-04-10T15:59:48.113 回答