加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – 防止篡改ASP.NET MVC EF中的表单字段

发布时间:2020-12-16 03:27:34 所属栏目:asp.Net 来源:网络整理
导读:ASP.NET MVC 3中默认的强类型编辑页面通常公开实体的所有字段.虽然这通常是可行的,但某些领域存在安全风险.例如,简化的杂志订阅实体可能如下所示: public void Subscription() { public int Id { get; set; } public string Name { get; set; } public stri
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]
public ActionResult Edit(订阅订阅)…方法,或行db.Entry(subscription).State = EntityState.Modified;尝试设置所有数据(我以为它只是设置一个标志,指示“编辑 – 所以 – EF-should-save-this”).

我是一名长期的.NET开发人员,刚刚进入我的第一个ASP.NET MVC项目,所以我可能会忽略一些非常明显的东西.谢谢你的帮助!

解决方法

So far my best solution seems to be to create a custom ViewModel that omits the SubscribedThru date,but that seems a lot of duplication of fields,validation,etc.;

这正是你应该做的事情,以保持整洁和安全整洁. AutoMapper缓解了ViewModel的变化问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读