ASP.NET WebApi OData服务如何加强滥用?

时间:2013-01-14 09:45:19

标签: asp.net-web-api odata

我喜欢OData,我对ASP.NET Web API的采用感到特别高兴。

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

最具体地说,我担心,如果有权运行任意查询,用户可以表达一个复杂的查询,强调操作系统到所有其他用户体验不好的程度。

在WebApi控制器中,OData端点公开如下:

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:2)

您不能使用此属性而是使用此属性,而是手动接受ODataQueryOptions参数,这样您就可以访问各种filter,top等选项以允许对它们进行验证。

不使用Queryable属性(您缺少它)。 / p>

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在结果上手动应用各种查询。 :)