1

在我看来,微风/odata 查询对数据的安全访问存在重大风险。例如,假设我有一个与受限实体 (R) 相关的非受限实体 (U)。我不会公开一个端点来查询 R,我会编写我的客户端来查询 U,而不包括相关的 R。但是,恶意客户端可以请求相关的 Rs。

我该如何防止这种情况?

我有几个想法。但是,我还没有能够实现它们,还不能说它们是否有效。尽管如此,以下是我的想法:

1) 检查每个结果实体——在执行查询之后但在结果发送到客户端之前。但是,我不知道如何在执行和发送到客户端之间插入我的检查代码(通过回调或其他方式):(

2) 将智能添加到 POCO,以根据用户角色检查受限实体和属性。例如,而不是:

class MyThing{
  public string P {get;set;}
}

我会有这样的事情:

private string _p;
public string P 
{ 
  get 
  { 
    if (UserRoles.HasAny("role-a","role-b"))
      return _p;
    return null; 
  }
  set { _p = value; }
}

这似乎很恶心,因为 POCO 应该是愚蠢的。POCO 需要能够从某个地方读取用户角色……也许是 HTTP 会话。我不太清楚这将如何运作。

我已阅读以下问题/答案,但它们对我没有帮助: breezejs 和 EF6 中基于角色的安全性,breeze.js如何 处理安全性并避免暴露业务逻辑如何使用 Breeze JS 处理授权?

4

2 回答 2

0

您可以使用AllowedQueryOptions 来阻止客户端执行$expand如此 SO answer中所述。

另一种方法是使用ODataQueryOptions作为 WebAPI 控制器方法的参数。这为您提供了服务器方法中查询谓词的详细信息,以便您可以根据需要应用它们,而不是让 WebAPI 自动应用它们。这将使您可以根据查询进行扩展或不扩展。

请参阅此答案此答案以了解其工作原理。

于 2016-09-16T00:57:47.023 回答
0

感谢任何阅读我的问题,思考它甚至做出回应的人。但是,没有任何建议对我有用。所以,我自己想通了。我可以实现我的选项#1 我的子类化一些微风类。我将 EnableBreezeQueryAttribute 子类化,以便我可以覆盖 NewQueryHelper 以返回我的 QueryHelper 子类。然后,我在我的服务方法上使用我的 CustomEnableBreezeQueryAttribute。ValidateData 方法与实体对象一起调用。如果该方法包含受限制的信息,我可能会失败,或者我可以清除受限制的信息——允许返回不受限制的信息。

public class CustomEnableBreezeQueryAttribute : EnableBreezeQueryAttribute
{
    private class CustomQueryHelper : QueryHelper
    {
        public override IEnumerable PostExecuteQuery(IEnumerable queryResult)
        {
            queryResult = ValidateData(queryResult);
            return base.PostExecuteQuery(queryResult);
        }

        private IEnumerable ValidateData(IEnumerable queryResult)
        {
            //TODO: validate/modify data
        }
    }

    protected override QueryHelper NewQueryHelper()
    {
        return new CustomQueryHelper();
    }
}

我很惊讶弄清楚如何做到这一点是多么困难。而且此时注入代码并不容易。给我留下了唠叨的问题:我在做不应该做的事情吗?或者这真的是 odata/breeze 功能中的一个漏洞吗?或者这是在 odata/breeze 中如何完成的?

于 2016-09-16T20:26:04.100 回答