当我从我的视图中的帐户列表中选择一个帐户时,该网址会显示如下内容:
http://example.com/BankAccount/EditBankAccount?bankAccountId=12
是否有办法隐藏主键,因为北方阻止某人编辑网址中的ID并发布,以获得其他帐户。
我可以添加代码以查看当前用户是否可以查看此帐户,但有更好的方法吗?
答案 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)
你可以:
不提供明确有意义的词语来描述查询字符串参数(例如:/EditBankAccount?p1=abc&p2=xyz
)
加密查询字符串参数,以便页面访问者无法确定实际值
如果适用于您的情况;在加密参数时使用salt值以防止彩虹表攻击。将salt密钥存储在会话中。
保持原样并对谁应该使用哪个对象的功能(即应用功能和对象级授权)应用严格的安全授权规则
当然,第3点会在会话到期后使URL无效。