gpt4 book ai didi

c# - ViewModel 如何防止恶意数据库更改?

转载 作者:行者123 更新时间:2023-11-30 21:39:13 25 4
gpt4 key购买 nike

同时查看 this answer问题Why do we use ViewModels? ,我遇到了这个部分:

"A view should not contain any non-presentational logic" and "You should not trust the View" (because a View could be user-provided). By providing a Model object (potentially still connected to an active DatabaseContext) a view can make malicious changes to your database.

这到底指的是什么?如果我的模型和 ViewModel 中有 UserIdPassword,安全性从何而来?在 Controller 中进行某种检查?我们检查什么?

我们如何确定我们可以信任 View 中的数据?这是由防伪 token 处理的吗?

最佳答案

我相信答案是指过帖问题。当您直接在 View 中使用实体类时,特别是如果您将发布的实体直接保存到数据库中时,恶意用户可能会修改表单以发布他们不应修改的字段。

例如,假设您有一个允许用户编辑小部件的表单。假设您拥有行级权限,这样用户只能编辑属于他们的小部件。因此,我们虚构的恶意用户 Joe 编辑了一个允许他编辑的 ID 为 123 的小部件。但是,他决定要破坏 Jane 的小部件,因此他向名为 Id 的表单添加了一个字段,并且给它 Jane 的小部件 ID 的值。当 Joe 然后发布小部件表单时,Jane 的小部件会更新。

View 模型不仅仅用于解决这个问题,但它基本上否定了这个问题,因为从本质上讲,您不能直接将 View 模型保存到数据库中。相反,您必须将 View 模型的值映射到实体,然后再将实体保存到数据库。因此,您随后可以显式控制映射和不映射的内容,因此在上面的同一示例中,Joe 更改 id 最终没有效果,因为您没有将其映射到实体。

事实上,这里的真正问题在于将用户发布的任何内容直接保存到数据库中。您实际上仍然可以将您的实体类作为“模型”提供给 View ,但不会保存已发布的实例。相反,您然后创建实体的新实例或从数据库中提取一个新实例,然后简单地将已发布实例的值映射到该实例。同样,您不会映射像 Id 这样的属性,因此 Joe 再次被挫败。换句话说,解决问题的不是 View 模型,而是从不足够信任用户直接保存通过 POST 创建的任何东西来解决问题。

Microsoft 以 Bind 属性的形式提供了另一种替代解决方案,它基本上允许您在模型绑定(bind)过程中包含/排除实体类上的某些属性(忽略任何已发布的值,换句话说).因此,例如,您可以通过使用 [Bind(Exclude = "Id")] 装饰您的操作的参数来潜在地解决上述问题,这将丢弃 Id 的任何发布值。但是,Bind 对于 number of reasons 来说太可怕了。 ,你实际上不应该使用它。始终使用 View 模型,或者根本不直接保存模型绑定(bind)器创建的实体实例。

关于c# - ViewModel 如何防止恶意数据库更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45307963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com