【问题标题】:How to secure are MVC RESTful Urls from Hacking?如何保护来自 Hacking 的 MVC RESTful Urls?
【发布时间】:2011-06-15 16:32:59
【问题描述】:

我最近读了一篇关于花旗集团黑客事件的有趣文章 http://www.nytimes.com/2011/06/14/technology/14security.html?_r=2&pagewanted=1&ref=technology

这让我想到,假设我的数据库中有一个包含 100,000 行的敏感员工数据表。该表有一个名为 Id 的主键,它是一个标识列。

员工可以登录 Web 门户并通过 RESTful Url ({Controller}/{Action}/{Id}) 检索其详细信息,例如/员工/详细信息/31

现在,是什么阻止我用 {Id} 参数替换任何参数(例如,Id = 32)和 检索员工 #32 的详细信息?花旗集团就是这样吗?

您如何防止这种情况发生?即用户已经在门户网站上进行了身份验证 但无权查看其他用户记录?我应该使用其他一些特定的“令牌”吗 除了 Id 之外的客户?

【问题讨论】:

  • 只是为了补充一点,我已经实现了一个自定义的 Membership API,它工作正常,即员工使用 FormsAuthentication 登录并创建了 FormsAuthentication Ticket (Cookie)。然后,我检查 Employee 是否在 Roles、IsAuthenticated 等中,以便向 Controllers & Actions 授予权限。但是......这仍然不能阻止访问不属于他的数据,即因为我已获得授权和授权访问 /Employee/Details 我仍然可以替换任何(猜测的)EmployeeId?
  • 您还可以加密和解密您在网址中使用的所有 ID,如果有人通过 Skype 将他的网址发送给某人,那么另一个人将能够使用它

标签: asp.net-mvc security restful-url


【解决方案1】:

这是我在完全相同的情况下所做的,首先我声明了对象的扩展:

public static bool Editable(this EXPENSE_OBJ e)
{
    if (e != null)
    {
       UserRepository ur = new UserRepository();

       if (ur.CurrentUser().UserId == e.UserId) //Check if the user owns the claim
       {
           return true; //User owns the claim
       }
       else
       {
           return false; //User does not own the claim
       }

    }
}

然后在控制器中:

public ActionResult Details(id)
{
    var item = repo.GetItem(id);
    if(!item.Editable())
    {
         return View("InvalidURL");
    }

    ...

}

【讨论】:

  • 嗨,克里斯,假设员工属于一家公司并检索公司详细信息,我调用 /Company/Details/101 即再次它是公司详细信息的 RESTful Url。在这种情况下,我想我还需要传入 UserId 并检查用户是否属于他在数据库级别检索的公司?
  • +1 这与我采用的方法大体相似。我的检查对象被扩展了一点,它允许管理员角色用户也可以查看/修改“用户”对象
  • 没错,虽然我个人已经实现了一个 ur.CurrentUser() 所以我永远不必通过用户 ID。
【解决方案2】:

您将希望利用 ASP.NET 角色和成员资格 API。如果你已经这样做了,那么你需要做的就是用IsUserInRole检查标记控制器。 您可以在此处找到有关角色类的更多信息:

MSDN Roles Class

【讨论】:

  • 嗨罗伯特,我已经实现了我自己的 Membership & Roles API,这工作正常,即我的应用程序。已通过身份验证,然后他被授权访问该操作。但是,用户随后使用操作从数据库中检索不同的数据集。我只需要保护对他的数据的访问。这有意义吗?
【解决方案3】:

我使用了一个多对多表,该表保存了用户与允许他们修改的实体的 ID 之间的关系。每次有人试图更改其中一个实体时,我都会进行检查以确保他们被允许这样做。我还在包含实体的表上放置了一个触发器,该实体将在删除实体时删除该多对多表中的关联记录。这对我来说效果很好。

您可以做的另一件事是使用 Guid 而不是 int 作为主键。这将防止人们猜测主键。

【讨论】:

    猜你喜欢
    • 2011-06-18
    • 2012-12-15
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2012-11-25
    • 1970-01-01
    • 2011-07-29
    相关资源
    最近更新 更多