Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 表单中更改Post参数的安全问题_C#_Asp.net Mvc 3_Asp.net Mvc 4 - Fatal编程技术网

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

C# 表单中更改Post参数的安全问题,c#,asp.net-mvc-3,asp.net-mvc-4,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)和@Ht

我有一个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)
,因此在回发中,模型填充了这些详细信息。我发现自己必须在整个系统中重复代码,以检查当前登录的用户是否可以更新这些客户详细信息,以及该客户是否属于该事件,因为

  • 如何通过使用inspect元素或类似工具更改源代码来阻止我编辑CustomerID字段?这将导致系统根据错误的ID更新错误的客户信息的问题
  • 我怎样才能阻止这一切

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

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

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

    这是一个非常普遍的问题,有很多方法来解决它。但是您可以简单地限制
    数据访问层
    ,只获取已经与用户id关联的数据

    一旦用户在您的系统中成功通过身份验证,您应在
    会话中保留
    用户ID
    ,或在
    Cookie中加密,并且决不能依靠客户端传递用户ID

    然后,您的
    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);
    }
    
    public ActionResult Show(Int32 id)
    {
    //假设您相应地更改了DAL/存储库
    var guestEvent=dataSource.GetUserEventById(id,会话[“userID”]为Int32);
    //或者..,假设DAL/存储库公开IQueryable
    var guestEvent=数据源
    .Where(x=>x.UserId==会话[“UserId”]作为Int32)
    .Single(x=>x.Id==Id);
    // ....
    返回视图(eventViewModel);
    }
    
    是的,但我需要从模型中至少传递一个参数到GetEventID(),更改此参数也会影响从数据库返回的内容?另外,根据模型,我将使用哪个参数?这取决于您和您的系统要求。能否从会话中检索用户id,从URL参数中检索EventID?