C# 表单中更改Post参数的安全问题
我有一个MVC4应用程序,我正在填充一个编辑表单的模型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
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)
,因此在回发中,模型填充了这些详细信息。我发现自己必须在整个系统中重复代码,以检查当前登录的用户是否可以更新这些客户详细信息,以及该客户是否属于该事件,因为
正如您所指出的,没有什么可以阻止用户编辑此客户端 不过,您不必从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?