显示主键是一种危险

时间:2014-01-05 06:01:55

标签: asp.net-mvc url

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

  

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

是否有办法隐藏主键,因为北方阻止某人编辑网址中的ID并发布,以获得其他帐户。

我可以添加代码以查看当前用户是否可以查看此帐户,但有更好的方法吗?

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

你问:

  

有没有办法隐藏主键?

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

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

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

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

我突出了差异。这个新的事务脚本不需要提供任何主键,因为它总是关于编辑当前用户帐户 - 而且永远不会是另一个。

这可以帮助您预防Insecure Direct Object References

答案 2 :(得分:0)

你可以:

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

  2. 加密查询字符串参数,以便页面访问者无法确定实际值

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

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

  5. 当然,第3点会在会话到期后使URL无效。