3

我最近读到一篇关于花旗集团黑客事件的有趣文章 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}) 检索他的详细信息,例如 /Employee/Details/31

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

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

4

3 回答 3

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

    ...

}
于 2011-06-15T16:42:50.073 回答
0

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

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

于 2011-06-15T17:04:14.033 回答
0

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

MSDN 角色类

于 2011-06-15T16:40:57.527 回答