Solr查询:fooField:foovalue OR barField:barValue
此查询可以被来自浏览器的查询覆盖,这有可能导致注入攻击。但是,转义:
和空格之类的特殊字符不会返回预期的结果。
有没有一种方法可以逃避查询并搜索solr字段以获得所需的结果?
答案 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>
中的冒号,在这种情况下,您可能希望通过可搜索的字段输入一个输入文本,以便将用户输入仅限于每个字段的值。