我最近读了一篇关于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?
答案 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
检查标记控制器。
您可以在此处找到有关角色类的更多信息:
答案 2 :(得分:0)
我使用多对多表来保存用户与允许修改的实体的ID之间的关系。每当有人试图更改其中一个实体时,我会进行检查以确保允许他们这样做。我还在表上放置了一个触发器,用于保存实体,这些实体将在删除实体时删除该多对多表中的关联记录。这对我来说非常好。
您可以做的另一件事是为您的主键使用Guid而不是int。这将阻止人们猜测主键。