我刚刚阅读了有关OData查询的ASP.Net Web API支持,我无法协调查询过滤的外部曝光,这实际上为集成商提供了在数据库中抛出任意查询过滤器的能力。不考虑最佳查询计划,不应查询的字段等等。
如何清理OData查询,以便用户不能直接在数据库中抛出可怕的复杂查询,这可能会导致性能问题,并且可能包含对不应执行的字段的引用?
答案 0 :(得分:2)
我们正在考虑解决这些问题。从Web API RC开始,我们要求您使用[Queryable]
显式注释方法,以指示您要选择自动筛选行为。我们还在研究其他一些可在以后使用的可扩展性/自定义API。
基本上,由于这是一个自动系统,因此需要开发人员了解所有性能/安全性因素。从某种意义上说,它与参数模型绑定中的重叠问题没有什么不同(例如,有人发布了一个将IsAdmin属性设置为true的User对象,即使您的API从未记录过它支持这样的属性。它恰好起作用,因为模型您在服务器上使用的类型也具有IsAdmin属性)。这些问题可以通过编写特定的DTO对象来解决,这些对象严格控制您公开的数据并接受它作为输入。
答案 1 :(得分:1)
Web API具有特殊的处理程序机制。因此,您可以检查和处理来自用户的查询。
http://www.asp.net/web-api/overview/working-with-http/http-message-handlers
但对于OData查询,从数据库中公开IQueryable并不常见。常见的方法是在服务器上进行“预先查询”的一般查询,并使用户能够查询或过滤此预先得到的结果。并且您将确保用户无法使查询“比”更好的查询结果。
并且注意:WebAPI仅支持filter,top,skip,orderby。非常有限。对于正常的OData支持 - 使用WCF数据服务
当你想隐藏用户过滤/查询某些列时,一种方法是编写自定义处理程序,它将解析用户的URI并返回例如: 403错误,或作为制作没有这些列的DTO对象的变体,并将它们公开给用户进行“预查询”。
答案 2 :(得分:1)
在我看来,这是使用OData查询语法的架构权衡。如果您不希望人们拥有无约束的查询访问权限,请不要使用它。它与SQL存储过程参数的SQL视图相同。