在搜索字段时在Solr查询中转义特殊字符?

时间:2019-06-27 19:16:39

标签: solr lucene

Solr查询:fooField:foovalue OR barField:barValue

此查询可以被来自浏览器的查询覆盖,这有可能导致注入攻击。但是,转义:和空格之类的特殊字符不会返回预期的结果。

有没有一种方法可以逃避查询并搜索solr字段以获得所需的结果?

2 个答案:

答案 0 :(得分:0)

edismax查询处理程序是针对以下情况而设计的-如果您不希望用户自己附加字段名称,请使用qf告诉Solr它应该搜索哪些字段,然后正确转义查询,并将其作为原始文本发送到q参数中。

如果要做要在不同的字段中搜索不同的值,则必须转义每个值,并使用显示的字段名称作为前缀。

答案 1 :(得分:0)

在这种情况下,为了防止注入攻击,考虑到查询字符串可能会被覆盖,您需要相应地过滤用户输入:

  • Web服务器应显示搜索表单,该表单必须先经过验证,然后才能从该表单发出Solr请求。不管用户界面中的输入是什么,这种形式都不应将查询字符串在提交后直接传递给Solr,而应解析和检查多个字段输入:

    ?fieldA=terms&fieldb=otherterms
    
  • 用户不应能够搜索任意字段名称:在验证处理程序中,您需要检查fieldname是否实际上可搜索。举例来说,这意味着如果[fieldA, fieldB, fieldC]是用户可以合法进行查询的唯一字段,则除这些字段之外的所有内容都应舍弃:

    ?fieldA=terms&inject:ed=willBeDiscarded
    

如果您需要用户能够在不同的字段中搜索不同的值-如果您无法使用qf-用户界面可能会有助于区分field:<terms>中的冒号和field:<termsContainingColon>中的冒号,在这种情况下,您可能希望通过可搜索的字段输入一个输入文本,以便将用户输入仅限于每个字段的值。