在表单中更改Post参数的安全问题

时间:2013-07-14 07:58:03

标签: c# asp.net-mvc-3 asp.net-mvc-4

我有一个MVC4应用程序,我正在为编辑表单填充模型。

public class GuestEventModel{

    public String name {get;set;}
    public Int32 GuestID {get;set;}
    public String Address {get;set;}
    public Int32 EventID {get;set;}


}

在我的表单中,我使用@Html.HiddenFor(m=> m.EventID)@Html.HiddenFor(m=> m.GuestID),因此在帖子中,模型会填充这些详细信息。我发现自己必须在整个系统中重复代码,以检查当前登录用户是否可以更新这些客户详细信息以及客户是否属于该事件,因为

  1. 什么是阻止我通过使用inspect元素或类似方法更改源代码来编辑CustomerID字段?这会导致系统根据错误的ID更新错误的客户信息的问题?
  2. 我怎么能阻止这个?

2 个答案:

答案 0 :(得分:2)

这是一个非常普遍的问题,有很多方法可以解决它。但您可以简单地限制Data Access Layer仅获取已与用户ID关联的数据。

用户在系统中成功通过身份验证后,您应该将userId保留在Session中或加密到Cookie内,而不是依靠客户端来传递userId。

然后,您的GuestEventModel可以是:

public class GuestEventModel
{
    public Int32 UserId { get; set; } // could also be a reference to a 'User' object
    public String name {get;set;}
    public Int32 GuestID {get;set;}
    public String Address {get;set;}
    public Int32 EventID {get;set;}
}

然后,只要您访问数据层/存储库:

public ActionResult Show(Int32 id)
{
     // assuming you changed your DAL/Repository accordingly
     var guestEvent = dataSource.GetUserEventById(id, Session["userID"] as Int32);

     // or.., assuming your DAL/Repository exposes IQueryable
     var guestEvent = dataSource<GuestEventModel>
                          .Where(x => x.UserId == Session["userID"] as Int32)
                          .Single(x => x.Id == id);

     // ....
     return View(eventViewModel);
}

答案 1 :(得分:0)

正如您所指出的,没有什么可以阻止用户编辑此客户端。

您不必从HTML填充它。在post方法中,您可以从服务器将EventID和GuestID分配给模型,以防止任何人更改它。

public ActionResult SaveEvent(GuestEventModel model) {
   model.EventID = this.Database.GetEventId();
   model.GuestID = this.Database.GetGuestId();
}