【问题标题】:Storing Model ID in ASP.NET MVC ViewModel, Security issues在 ASP.NET MVC ViewModel 中存储模型 ID,安全问题
【发布时间】:2011-10-19 19:18:05
【问题描述】:

在我的 MVC 应用程序中,我有一个页面供用户编辑其帐户详细信息,例如电子邮件地址、密码等。在我的数据库中,用户表保存这些数据,主键是 UserId。

在我创建的 ChangeAccountDetails 视图中,我传递了一个 ViewModel,其中包含用户应该能够在其帐户上修改的数据。我还将 UserId 存储在 ViewModel 中,它在我的实际视图中呈现为隐藏字段。我担心这是不安全的,因为在 POST 操作以保存更改的数据时,我的服务层会加载用户帐户详细信息的持久版本,该版本刚刚由 ViewModel 中发回的 UserId 更改。

我已使用 Fiddler 更改 POST 请求并将 UserId 更改为我数据库中另一个用户记录的 UserId,这可能会产生严重问题,因为有人可能会以这种方式更改其他人的密码和/或其他详细信息。

请有人建议我在使用 ViewModels 时如何避免此类问题。是不是在这种情况下使用 Session 是唯一的方法(我知道最好避免使用 Session 但为此目的呢)?

【问题讨论】:

    标签: asp.net-mvc-3 session viewmodel security


    【解决方案1】:

    我通过加密 sessionKey 的方法来做到这一点,这个加密的密钥包含用户详细信息,例如 ID 等。ID 的隐藏字段在表单上始终为零,这将更改为我的 user.UserId 的 ID。

    我有一个用户模型(用户),该模型填充了会话中的解密数据,这就是我处理用户级别等的方式。

    我的未加密字符串如下所示:userid||email||datetimelogin||users-GUID||Real Name||userlevel

    然后在 255 处使用自己的私钥对其进行加密。

    只是一个想法,虽然我想大多数人很容易忘记人们可以摆弄 ID。

    zasz 上面的想法也完全有效,但是您必须构建一个视图模型来说明 GUID 的额外字段并说明缺少的 UserId 字段。

    【讨论】:

      【解决方案2】:

      这是一个常见问题。最好不要将 UserID 发送到客户端来解决。由于您不想使用服务器端会话,并且想要保护您的应用免受恶意用户的攻击,因此您必须使用数据库表模拟会话。当用户登录时,将您的 UserId 和 Random GUID 放入表中。确保该表对于任何给定的 UserId 只有一行(我尝试简化 - 当用户稍后再次登录时使用新的 guid 更新现有行)。

      现在将 GUID 作为 ViewModel 的一部分发送给客户端。当更新的电子邮件等返回原始 guid 时,请查阅我们的表格以将 guid 解析回用户 ID。请注意,这是一个基本会话,并实现了防篡改。篡改 GUID 以查找其他用户 Guid 几乎是不可能的。

      正如您正确地感觉到的那样,将我们的任何模型的数据库身份发送给客户端,不仅是用户作为输入隐藏字段是一个坏主意,而且每个黑客醒来后的早餐就是查看隐藏的输入字段和摆弄一下。

      【讨论】:

      • 非常感谢您的解决方案。我不确定我会在你的和 minus4 之间使用哪一个,但我很高兴我不是唯一一个以这种方式考虑安全性的人,因为我很难在堆栈溢出和其他任何地方发现这个问题论坛。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多