- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
同时查看 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 中有 UserId
和 Password
,安全性从何而来?在 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/
这个问题在这里已经有了答案: The Bash command :(){ :|:& };: will spawn processes to kernel death. Can you explain
这个恶意 javascript 代码到底在做什么? (function () { var qk = document.createElement('iframe'); qk.src =
我的 JavaScript 代码是否可以在运行时被(恶意)用户编辑,即使它已上传到网络托管站点? 例如,如果我在脚本中声明一个变量,如下所示: var myvalue = 2; 我想知道是否可以编辑为
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
例子: if($('#' + untrusted_js_code).length) > 0 ....` 通常“untrusted_js_code”应该是表示项目 ID 的简单字符串。变量的值来自
我不确定这是 StackOverflow 还是更多的程序员问题,但这里的其他几个人也提出了类似的问题。 在扫描我的 Google Analytics 帐户时,我注意到一些退出链接标记有查询字符串: ?
我正在开发一个 servlet(在 tomcat 上运行),它接收包含 Java 脚本代码的请求,并使用 java 脚本 API 框架评估/运行代码并将答案返回给用户。 由于我们处理的是用户生成的代码
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我是一名优秀的程序员,十分优秀!