如何保护来自Hacking的MVC RESTful Urls?

时间:2011-06-15 16:33:00

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

我最近读了一篇关于CitiGroup Hacking事件的有趣文章 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的详细信息?这是花旗集团发生的事情吗?

你怎么防止这种情况?即用户已经在Web门户上进行了身份验证的位置 但是未授权查看其他用户记录?我应该使用其他一些特定的'令牌' 客户除了Id?

3 个答案:

答案 0 :(得分:3)

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

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");
    }

    ...

}

答案 1 :(得分:0)

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

MSDN Roles Class

答案 2 :(得分:0)

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

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