gpt4 book ai didi

asp.net-mvc - View 直接使用领域模型有危险吗?

转载 作者:行者123 更新时间:2023-12-04 22:48:53 25 4
gpt4 key购买 nike

我使用 EF 代码优先方法来定义我的数据库结构。目前,我将 EF 实体类直接传递到 MVC 应用程序中的一些 View 中。这使得填充和保存 View 变得容易,因为我可以直接让一个存储库给我填充的 ​​EF 类,如果我的 Controller 在回发中收到一个 EF 实体类,我可以(如果验证正常)直接通过到存储库以保存它。但是,这是否存在潜在的安全风险?如果实体类上有我不想修改的属性,客户端是否可以将这些属性作为回发的一部分提交回来并无论如何修改它们?例如,假设我有一个 View 来编辑我将此 EF 模型传递给的用户:

public class User {
[Required]
public string Firstname { get; set; }
[Required]
public string Surname { get; set; }
public DateTime DOB { get; set; }
public bool IsDisabled { get; set; }
}

我可能会暴露 Firstname , Surname , 和 DOB作为可编辑的表单字段,但我不希望用户能够设置 IsDisabled并禁用他们的帐户。预防这种情况的最佳方法是什么?或许只有在认为用户可以设置由该域模型持久保存的每个属性都可以的情况下,或者仅在使用该域模型来显示事物而不是将事物保存回数据存储?

最佳答案

是的,将实体直接传递给您的 View 可能很危险。从技术上讲,问题在于当您直接建模绑定(bind)到实体时。

是的,你提出的情况很有可能发生。更糟糕。假设您传递了一个 User 对象,那么攻击者可以提交一个 post 值来执行诸如将 IsAdmin 设置为 true 之类的操作,或者更改分配给用户的角色。

当然,这一切都取决于用户是否知道(或能够猜测)您的数据结构。这可能并不像看起来那么困难,因为我们在生成的 HTML 中经常有提供提示的迹象。

这个问题有两种解决方案:

1)使用 View 模型。 View 模型仅包含 View 中允许的数据。您还可以控制将哪些数据复制回实体模型。

2)您可以使用[Bind]属性以指定排除和包含以将各种属性列入白名单和黑名单。

我更喜欢使用第一种方法,因为忘记将某些内容列入白名单或列入黑名单要困难得多(特别是如果您稍后更改某些内容并忘记在绑定(bind)它的任何地方更新列表)。我也觉得[Bind]作弊并鼓励草率的设计。

关于asp.net-mvc - View 直接使用领域模型有危险吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12887663/

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