【问题标题】:How can ASP.NET WebApi OData services be hardened against abuse?如何强化 ASP.NET WebApi OData 服务以防止滥用?
【发布时间】:2012-12-28 06:32:55
【问题描述】:

我喜欢 OData,我特别高兴它被 ASP.NET Web API 采用。

我创建了一些服务供内部应用程序使用,但从不供公众使用。主要原因是 OData 的开放性似乎很难做到“安全”以防止滥用。

最具体地说,我担心鉴于运行任意查询的能力,用户可能会表达一个复杂的查询,这会给操作系统带来压力,以至于对所有其他用户的体验都不好。

在 WebApi 控制器中,OData 端点暴露如下:

public class OrderController
{
    [Queryable]
    public IQueryable<Orders> Get()
    {
         // Compose and return the IQueryable<Orders>
    }
}

这可以完全控制查询的组合和执行过程,但通过复杂的IQuerable&lt;T&gt; 接口可以做到这一点。为用户提供信息的子集变得微不足道,例如附加 Where 以仅包含他们有权访问的记录。

是否有 IQueryable&lt;T&gt; 实现可以包装现有的 IQuerable&lt;T&gt; 实例以限制用户可以运行的查询?我最感兴趣的是限制查询的复杂性,但我也希望能够防止用户遍历他们不应访问的资源的关联。

【问题讨论】:

    标签: asp.net-web-api odata


    【解决方案1】:

    我想您会很高兴在 RTM 中了解到这一点,我们添加了一些选项,让您可以自定义要向用户公开的查询类型。例如,您可以这样做:

    [Queryable(
        AllowedFunctions = AllowedFunctions.AllStringFunctions,
        AllowedLogicalOperators = AllowedLogicalOperators.Equal,
        AllowedOrderByProperties = "ID")]
    

    并以几种常见的方式限制您的查询。如果您想进一步限制查询,可以插入验证钩子,例如 ODataQueryValidator 或覆盖 [Queryable] 属性上的 ValidateQuery 方法。

    您可以使用我们的夜间构建来访问这些功能,或者自己构建最新的位。

    【讨论】:

      【解决方案2】:

      您不能使用 Queryable 属性(您缺少该属性),而不能使用此属性,而是手动接受 ODataQueryOptions 参数,该参数使您可以访问各种过滤器、顶部等选项以允许对其进行验证。

      OData 查询调用的任何函数都可以传递一个参数 ODataQueryOptions,例如:

      public IQueryable<T> Get(ODataQueryOptions options)`  
      { 
      //Use the following vars to fetch the values, and check if
      //they are as you expect them to be. etc.  
      options.Top.RawValue;
      options.Filter.Value;
      options.Filter.ApplyTo();
      }
      

      在这种情况下,您可以跳过 [Queryable] 属性并使用 ApplyTo 手动将各种查询应用于结果。 :)

      【讨论】:

      • 适当地注意到缺少的属性。我已将其添加到问题中。您能否提供一个使用ODataQueryOptions 参数的示例?
      • 请参阅“下拉至 ODataQueryOptions”部分中的 blogs.msdn.com/b/alexj/archive/2012/08/21/… 以获取想法。正如您在示例中看到的那样,您仍然可以通过执行“大致相当于”来让查询正常处理,但只需在此之前添加 ODataQueryOptions 的验证。
      • @Tragedian :我已经更新了答案,请查看如何使用此options 手动检查查询是否有滥用。
      猜你喜欢
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      • 2013-11-26
      • 2015-02-07
      • 1970-01-01
      • 2012-02-27
      相关资源
      最近更新 更多