Lucene查询语言是黑客证明吗?

时间:2012-04-10 15:41:14

标签: lucene

显然它不能用于删除索引或破解卡号,密码等(除非一个人足够愚蠢地将卡号或密码放在索引中)。

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

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

2 个答案:

答案 0 :(得分:5)

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

  • 要收集的最高结果数量的高值

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

  • 对任意字段进行排序

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

  • 术语字典密集查询

有些查询比其他查询更昂贵。为了防止查询执行花费太长时间,Lucene已经有一些防范过于复杂的查询:默认情况下,BooleanQuery cannot have more than 1024 clauses

其他查询(例如通配符查询和模糊查询)也非常昂贵。

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

答案 1 :(得分:1)

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

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