我目前正在 MVC4 中创建一些用户配置文件编辑表单,为了进行测试,我将 UserId 属性渲染到表单上的只读文本框中,如下所示:
<li>
@Html.LabelFor(model => model.UserId)
@Html.TextBoxFor(model => model.UserId, new { @readonly="readonly"})
</li>
当我即将完成编辑表单时,我删除了此文本框,因为它只是耗尽了空间。完成此操作后,保存时发送回 Controller 的模型的整数默认值为 0,然后 Entity Framework 就会崩溃,因为它无法更新任何行。所以我将其添加到表单中:
<li>
@Html.HiddenFor(model => model.UserId, new { @readonly="readonly"})
</li>
这是一个安全的举动吗?我应该使用 ViewBag 来做这样的事情吗?在个人资料详细信息页面上,我呈现一个如下所示的编辑按钮:
@Html.ActionLink("Edit", "Edit", new { id=Model.UserId })
意味着 UserId 在链接中呈现。这是否安全可靠,还是我需要重新考虑如何在 UI 中移动模型和 id?
TIA,
最佳答案
Is this a safe move?
这将完成将 ID 发送到服务器的工作。只需删除 readonly="readonly"
属性即可,该属性对于隐藏输入来说意义不大。
Should I be using the ViewBag for things like this?
这不会改变安全性方面的任何内容。任何用户仍然可以输入他想要的任何 ID。无论您使用隐藏字段还是 ActionLink,您仍然会将 id 以纯文本形式发送到服务器,任何人都可以伪造请求并输入他想要的任何 id。因此,如果您的站点使用某种形式的身份验证,则在尝试对其执行任何操作之前,您必须在服务器端绝对检查您收到的 id 实际上是属于当前经过身份验证的用户的资源。否则,某些经过身份验证的用户可以提供属于另一个用户的资源 ID,并能够更新它。当然,这只是一个假设的场景,根本不清楚这是否是您的情况以及此 id
是否需要受到保护。
关于asp.net-mvc - 如果未绑定(bind),MVC4 Razor 会丢失用户 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12837733/