lucene - Lucene 查询语言是否可以破解

标签 lucene

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

是否有可能因过于复杂的搜索而​​导致服务器瘫痪?

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

最佳答案

不可能根据查询解析器的输入修改索引。然而,有一些事情可能会损害运行 Lucene 的搜索服务器:

  • 要收集的热门结果数量的值(value)很高

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

  • 按任意字段排序

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

  • 术语词典密集查询

某些查询比其他查询更昂贵。为了防止查询执行时间过长,Lucene 已经针对过于复杂的查询采取了一些防范措施:默认情况下,BooleanQuery cannot have more than 1024 clauses .

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

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

关于lucene - Lucene 查询语言是否可以破解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10091909/

相关文章:

lucene - 从 Azure 辅助角色向 Azure Web 角色发送通知 - 最佳实践

java - 如何用 "like"算子查询lucene?

java - Lucene 区分大小写和不区分大小写的搜索

elasticsearch - 如何使热门匹配结果多样化?

elasticsearch - ElasticSearch只能添加字段索引,而不能像lucene Field.Store.NO一样保存原始值

java - 在 Lucene 分类器中使用多个叶子

javascript - 如何使用 ElasticSearch 索引源代码

java - Lucene从索引文件中获取所有未删除的文档

java - Lucene荧光笔TokenStream异常

android - 是否可以在android中的eclipse中导入Lucene库