在ASP中存储模型ID.. NET MVC视图模型,安全问题



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

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

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

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

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

我有一个用户模型(user),该模型填充了来自会话的解密数据,这就是我如何处理userlevel等。

我的未加密字符串看起来像这样:userid||email|| datetimellogin ||users-GUID||实名||userlevel

然后用自己的私钥255对

进行加密。

只是一个想法,很好的观点,尽管我想对于大多数人来说,很容易忘记人们可以篡改ID。

zasz上面的想法也是完全有效的,但是你必须建立一个视图模型来解释GUID的额外字段和缺失的UserId字段。

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

现在将GUID作为ViewModel的一部分发送到客户机。当更新后的电子邮件等返回原始guid时,请参考我们的表将guid解析回用户id。请注意,这是一种基本会话,并实现了防篡改。篡改GUID来找到其他用户的GUID几乎是不可能的。

正如你所感觉到的那样,将任何模型的数据库标识发送到客户端,而不仅仅是用户作为输入隐藏字段是一个坏主意,每个黑客醒来后的早餐都是查看隐藏输入字段并对其进行修补。

相关内容

  • 没有找到相关文章

最新更新