【发布时间】:2020-03-17 02:07:36
【问题描述】:
我有一个模型,它有几个我不想被用户编辑的字段。如何创建一个不仅隐藏这些字段,而且防止用户自己注入输入元素的编辑页面?
谢谢
【问题讨论】:
标签: asp.net-mvc entity-framework
我有一个模型,它有几个我不想被用户编辑的字段。如何创建一个不仅隐藏这些字段,而且防止用户自己注入输入元素的编辑页面?
谢谢
【问题讨论】:
标签: asp.net-mvc entity-framework
看看TryUpdateModel() (MSDN article found here.)。您可以指定您希望实际更新的方法的黑名单和白名单:
public ActionResult MyUpdateMethod (MyModel myModel)
{
if (ModelState.IsValid)
{
var myDomainModel = new DomainModel ();
if (TryUpdateModel (myDomainModel,
new string[] { /* WhiteList Properties here */ },
new string[] { /* BlackList Properties here */ })
{
// Save it or do whatever
return RedirectToActionV (/* Yada */);
}
}
return View (myModel);
}
}
除此之外,我会确保您发布的模型不包含您希望用户更新的字段,尽管可以使用手工制作的表单帖子覆盖这些字段。这至少可以帮助您确保不会不小心将字段放在您不想编辑的页面上。
【讨论】:
如果您不希望字段可编辑,为什么首先要在编辑表单中使它们可编辑?使用两个单独的视图模型。一个用于 GET 请求,您可以在其中显示所有必要的数据。只读数据将只是文本/标签。第二个视图模型将用于 POST / PUT 请求,您只传递可以编辑的数据。
如果在任何情况下您需要一些数据来回传输,您可以将它们放置到隐藏字段并使用带有哈希的第二个隐藏字段。你可以得到哈希(伪代码):
ComputeSHA1(dataValue.ToString() + salt);
盐是只有您的应用程序知道的秘密值。当数据往返于您的应用程序时,您将再次计算哈希(您必须使用相同的盐)并将其与存储在请求中的哈希进行比较。如果这两个不同,则用户试图操纵这些隐藏字段。
【讨论】:
与其为您的基本模型实施允许编辑所有字段的编辑操作,不如创建一个单独的模型,其中仅包含您要编辑的字段。这种 ViewModel 方法更安全,并且避免了必须始终指定属性列表的问题,例如白名单/黑名单方法。
更多信息请参见:How to Preserve/Protect Certain Fields in Edit in ASP.NET MVC
【讨论】:
您可以通过在 Model 类的顶部添加它来防止字段被 HTTP(也称为用户)修改。
// Exclude Fields from being modified by user
[Bind(Exclude = "ID, Name, other fields you want excluded")]
public class YourModel
【讨论】: