在Azure搜索中将Lucene语法作为对象而不是查询字符串

9bfwbjaz  于 2022-11-23  发布在  Lucene
关注(0)|答案(1)|浏览(151)

bounty将在2天后过期。回答此问题可获得+100的声望奖励。LosManos希望吸引更多人关注此问题:结构很重要。安全方面,重要的是不能突破过滤器。

我更希望有人发现ACS已经支持这一点。第二好的是一个坚固的库。第二好的也是可复制的代码(比我已经拥有的更好)。
我想将筛选器作为语法树而不是查询字符串发送到Azure搜索。可以吗?
我所能找到的就是将过滤器作为字符串发送。
我有一个类似( State eq 1 ) or ( Domain eq 'Love' )的过滤器语法,但我想将其参数化而不是作为字符串发送到Azure搜索。(这是一个安全问题-我不希望必须转义/清洗indata,而是让Microsoft/Azure/Lucene处理细节,因为他们比我更了解内部工作原理。)
基本上:我想

filter = 
  Or ( 
    Equal( "State", stateValue ), 
    Equal( "FieldName", domainValue )
  )

而不是我这样做

filter = $"( 'State' eq {MyStringEscapeFunction(stateValue)} ) " + 
  "or ( 'Love' eq {MyStringEscapeFunction(domainValue)} )"
siotufzp

siotufzp1#

Azure认知搜索中的筛选器必须使用OData语法通过$filter参数指定。
https://learn.microsoft.com/en-us/azure/search/search-query-odata-filter
您的示例筛选器是有效的OData筛选器。前提是您有一个索引,其中State是数字,Domain是文本。

$filter=(State eq 1) or (Domain eq 'Love')

如果我没有理解错您的问题,您的应用程序中的值1和“Love”是来自最终用户的输入。Azure Search API将根据数据类型验证筛选器值是否有效。除此之外,您负责验证应用程序的输入。
例如,假设您的输入参数分别是State和Domain的s和d。您可能会冒着有人试图操纵筛选器返回您不希望的结果的风险:

yourpage.aspx?s=1&d=Love%27%20or%20Domain%20eq%20%27Hate

这可能会导致您的$filter查询变成:

$filter=(State eq 1) or (Domain eq 'Love' or Domain eq 'Hate')

您负责实作验证。在$filter查询中使用使用者输入之前,您必须先建立验证使用者输入的层。您可以在此验证使用者的状态和网域输入是否限制为有效值,然后再建立OData筛选。请参阅此处的范例:
https://learn.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-7.0

相关问题