【问题标题】:Showing the Primary Key is a danger显示主键是危险的
【发布时间】:2014-01-05 06:01:54
【问题描述】:

例如,当我从视图中的帐户列表中选择一个帐户时,URL 会显示如下内容:

http://example.com/BankAccount/EditBankAccount?bankAccountId=12

有没有办法隐藏主键,因为北向阻止某人编辑 URL 中的 id 并发布它,以获得不同的帐户。

我可以添加代码来查看当前用户是否可以查看这个账号,但是有没有更好的方法?

【问题讨论】:

  • 你可以hash url参数,你试过吗?
  • 不,我不确定那是什么意思。
  • "我可以加代码看看当前用户是否可以查看这个账号,但是有没有更好的办法?" --- 你不仅可以这样做,而且应该这样做。
  • 显示 PK 没有任何问题 - 例如看一下这个页面的 url。

标签: asp.net-mvc url


【解决方案1】:

无需从 url 中隐藏密钥。例如,您是否查看过 StackOverflow 上的 url?你到处都挂着PK。否则,您将如何了解当前用户正在尝试编辑哪个银行帐户?

您应该做的是编写一个授权过滤器,以确保 url 中提供的 id 实际上是属于当前经过身份验证的用户的帐户。我已经说明了如何在this similar thread 中实现这样的授权过滤器。

【讨论】:

    【解决方案2】:

    你问:

    有没有办法隐藏主键?

    当然有,只是不提供。让我们回顾一下您当前的 URI:

    http://example.com/BankAccount/EditBankAccount?bankAccountId=12
                                                   ^^^^^^^^^^^^^^^^
    

    若要隐藏主键,请将其移除并将其编码为事务脚本名称的一部分,例如:

    http://example.com/BankAccount/EditMyBankAccount
                                       ^^
    

    我已经强调了不同之处。这个新的事务脚本不需要提供任何主键,因为它始终是关于编辑当前用户帐户的——而且永远不会是不同的。

    这应该可以帮助您防止Insecure Direct Object References

    【讨论】:

    • 这当然假设用户和银行账户之间存在直接的一对一关系。情况可能并非如此。
    • @pwdst:问题的文本区分了帐户,并且不应访问给定的帐户。因此,这种关系不是假设的,而是在问题中给出的。此外,即使不是这种情况,通过区分属性而不是任何帐户的直接对象引用来采用它也没有问题(在内部,无论如何你都会有该用户对帐户的检查,所以这个解决方案直接需要进行必要的检查)。
    • “例如,当我从我的视图中的帐户列表中选择一个帐户时” 表明用户可能有权访问多个帐户 - 但不应该有权访问其他用户的帐户。我赞成您的回答,因为不安全的直接对象引用链接适用于所有情况,并且基于用户推断主键将有助于防止将部分数据泄露给可以看到端点地址但看不到内容的人(例如,使用 HTTPS 保护)。
    • 是的,我明白这一点。但用户也已经在他的问题中找到了解决方案。检查是否允许访问该对象。无论要修改的具体帐户的信息如何传递,这在任何情况下都是必需的。
    【解决方案3】:

    你可以:

    1. 不要给出明确的有意义的词来描述查询字符串参数(如:/EditBankAccount?p1=abc&p2=xyz

    2. 对查询字符串参数进行加密,这样页面访问者就不会找出真正的值

    3. 如果适用于您的情况;在加密参数时使用盐值以防止彩虹表攻击。将 salt 密钥存储在会话中。

    4. 保持原样并对谁应该在哪个对象上使用什么功能应用严格的安全授权规则(即应用功能和对象级授权)

    当然,第3点会让会话过期后的URL失效。

    【讨论】:

    • @zerkms:可能从你的角度来看,但最初的问题是询问如何隐藏它。
    • 如果有人问如何用电锯刮胡子 - 你会建议如何以更好的方式做到这一点,或者更好地解释有剃须刀片吗?
    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 2022-11-17
    • 2018-09-04
    • 1970-01-01
    • 2012-08-30
    相关资源
    最近更新 更多