【问题标题】:Update by key (integer) security issue按键更新(整数)安全问题
【发布时间】:2014-03-27 04:18:29
【问题描述】:

我们的数据库有整数作为主键。让我们假设一个用例,其中有代表管理分配给他们的不同客户。一种情况是代表可以更新客户联系信息。我们的页面按 id 显示联系信息。当代表按下更新时,它使用 id 进行更新。如果代表更改 ID,这会带来安全问题,他们可以查看并更新其他客户(可能未分配给他们)的联系信息。我相信这是一个普遍的问题。

一种方法可能是在会话中保留密钥,加密 id 并在更新时使用该密钥对其进行解密。有没有更好的办法?

另外,既然不同的页面都要做同样的事情,那么在asp.net mvc中是否有一个通用的方法可以遵循?

【问题讨论】:

  • 您可以简单地使用某种盐渍。每次生成 GUID,在两者之间插入您的 id(但在特定位置)。送出去的时候,用这个盐腌。当您在查询字符串中收到它时,取出您的 id 并通过其他东西。为此,您可以编写静态类,供所有人使用。
  • 你能告诉使用哪些类来执行此操作吗?谢谢。

标签: c# sql asp.net-mvc security


【解决方案1】:

如果您有代表和分配给他们的客户,我假设您将这些信息以某种形式的访问控制列表存储在您的数据库中,对吧?

如果是这种情况,那么您应该在服务器上强制用户 X 有权查看/更改/删除客户 Y。检查 GET /Edit/Customer/1 和 POST /Edit/Customer/1 的权限你应该很高兴。

由于您没有显示任何代码或数据库架构,我无法给您提供更具体的示例,但我希望我自己解释一下。

【讨论】:

  • 这可能不是一个选项,因为代表可以编辑客户中的许多内容。假设联系人、订单等。要编辑联系人,URL 可能类似于 /edit/customercontact?customerId=1&contactId=1。现在我们需要检查联系人 ID 是否属于客户以及客户是否属于正确的代表。同样,如果还有一个级别,则很难验证所有级别。我不能给出 db 模式,因为这个例子是组成的,但与我们的用例非常相似。
【解决方案2】:

我猜你在查询字符串中显示了 ID,用户可以更改它。首先不要那样做。用户敏感信息永远不应作为纯文本在查询字符串中传递。您可以使用 Encryption 对 id 进行加密,然后再检索它。

【讨论】:

  • 值经过哈希处理后,无法检索。需要使用一些加盐或加密。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 2019-04-27
  • 2014-12-27
  • 2012-04-13
  • 2012-10-20
相关资源
最近更新 更多