asp.net-mvc-3 – 防止篡改ASP.NET MVC EF中的表单字段
ASP.NET MVC 3中默认的强类型编辑页面通常公开实体的所有字段.虽然这通常是可行的,但某些领域存在安全风险.例如,简化的杂志订阅实体可能如下所示:
public void Subscription() { public int Id { get; set; } public string Name { get; set; } public string Address { get; set; } public string City { get; set; } public string State { get; set; } public string Zip { get; set; } public DateTime SubscribedThru { get; set; } } 例如,如果我提供编辑页面以允许用户更改自己的地址,则包含SubscribedThru字段存在安全风险,因为知识渊博且恶意的用户可以通过伪造日期为自己提供10年免费订阅(即使我使用@ Html.HiddenFor(model => model.SubscribedThru).所以我没有在编辑页面html(通过razor)上以任何方式包含该字段. 我认为答案可能是防止在控制器中的Edit方法上使用以下内容对SubscribedThru进行绑定尝试: [HttpPost] public ActionResult Edit([Bind(Exclude="SubscribedThru")] Subscription subscription) { if (ModelState.IsValid) { db.Entry(subscription).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); } } return View(subscription); } 当我到达SaveChanges();行,它会引发错误将datetime2数据类型转换为日期时间数据类型会导致超出范围的值.我相信SubscribedThru日期(正确?)不存在,空值小于SQL Server可以处理的值.令我惊讶的是,当我将Binding排除在外时,它甚至会尝试更新该字段. 到目前为止,我最好的解决方案似乎是创建一个省略SubscribedThru日期的自定义ViewModel,但这似乎有很多重复的字段,验证等;如果可能的话,我想让用户编辑的一个字段SubscribedThru安全无虞. 我不能说我完全理解UpdateModel和TryUpdateModel方法,并想知道这是否是一个方向?我和他们一起玩,EF因为有重复的对象(相同的密钥)而引发错误. 另外,我不清楚订阅数据是否从控制器中的公共ActionResult Edit(int id)中的初始加载一直保留到最终[HttpPost] 我是一名长期的.NET开发人员,刚刚进入我的第一个ASP.NET MVC项目,所以我可能会忽略一些非常明显的东西.谢谢你的帮助! 解决方法
这正是你应该做的事情,以保持整洁和安全整洁. AutoMapper缓解了ViewModel的变化问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 无法找到asp.net-mvc – System.Data.Entity.DataBase
- 禁用ASP.NET HttpHandler响应缓存
- asp.net – 你会认为这是一个单身/单身模式吗?
- asp.net-mvc – SSL握手问题? (当时:网页挂起,只清除浏览
- asp.net-mvc-4 – 以复杂对象为参数的Web API获取方法
- 找出ASP.NET WebForms中控件的生命周期的哪个阶段
- asp.net-mvc – 为什么HttpContext不是从HttpContextBase派
- asp.net-mvc – 多选项卡验证无效
- asp.net-mvc – Asp.Net MVC中设计师友好的视图
- ASP.NET站点架构问题