5

这听起来像是一个愚蠢的问题,但我只是想知道我是否在任何地方错过了一个技巧。

场景是,我有一个使用 Simple Memebership 的 Web 应用程序,用户可以注册使用它(例如发票程序)。

但是,他们应该只能查看/更新/删除他们自己添加到数据库/Web 应用程序的信息。

确保用户只能访问其信息的最佳方法是什么?

是否为每个表添加一个用户名字段,例如:

public class Invoice
{
     public int InvoiceId { get; set; }
     public int CustId { get; set; }
     public string UserName { get; set; }
}

public class Item
{
   public int ItemId { get; set; }
   public int InvoiceId { get; set; }
   public string UserName { get; set; }
}

...然后在任何访问数据的控制器中,只需在每个查询中添加对用户名的检查,例如:

var Inv = db.Invoices.Where(x => x.UserName = User.Identity.Name);
var Itm = db.Items.Where(y => y.UserName = User.Identity.Name);

这就是我目前正在使用的,但想知道这是否是最佳实践?或者如果现在我们进入 MVC4 有更简单的方法?

最好使用UserProfile表中的UserNameUserId,还是有关系?

更新以在评论后添加清晰度

因此,已有 10 个用户注册 - 并且都创建了自己的发票。我不希望任何用户看到任何其他用户的发票。

感谢您的任何建议。

标记

4

3 回答 3

3

我会做的事情是:

  1. 避免在发布/查询字符串中传递任何形式的用户 ID/凭据,将其保存在安全的地方,例如在 cookie 中加密,并在构建查询时始终使用它

  2. 如果您将 Id 作为编辑的一部分传回程序,请确保这些值没有被篡改,如果您在隐藏字段中输出 id,请确保它在返回时与输出时相同(这就是所谓的直接引用攻击)

  3. 如果您的应用程序请求编辑,例如 client/edit/4,请始终确保 id 4 属于该用户,然后再显示它。

这里有一些关于前 10 个漏洞的好读物:https ://www.owasp.org/index.php/Top_10_2010-Main

于 2013-04-19T12:14:20.657 回答
2

如果您正确设置数据库关系,您应该能够参考例如用户的发票,如下所示:

var invoices = dbContext.Users.first(u=>u.id == idParam).Invoices;

您可以通过测试验证发票是否属于用户

if(dbContext.Invoices.Any(i=>i.invoiceID))//invoice exists?
{
    //Invoice belongs to user?
    bool invoiceBelongsToUser = dbContext.Users.first(u=>u.id == idParam)
    .Invoices.Any(i=>i.invoiceID == invoiceIDParam);
}
于 2013-04-19T12:26:05.093 回答
0

您可以将AuthorizeAttribute过滤器添加到 global.asax 文件中,以保护每个控制器的每个操作方法。

控制器无需授权:

 [AllowAnonymous]
 public ActionResult LogOn() 

保护您的 asp-net-mvc-3-应用程序

于 2013-04-19T11:54:28.720 回答