我应该在ASP中公开主键吗?. NET MVC视图
本文关键字:NET MVC 视图 ASP 我应该 | 更新日期: 2023-09-27 18:03:57
在我的web应用程序中,我使用主键来生成超链接,以便导航到不同的页面:
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
@Html.ActionLink("Details", "Details", new { id = item.Id }) |
@Html.ActionLink("Delete", "Delete", new { id = item.Id })
</td>
我想知道这个代码是否有安全问题。在ASP中公开主键是否可取?. NET MVC视图?如果是这样的话,还有什么替代方案呢?我应该加密视图模型中的id,还是应该创建公钥和私钥之间的映射表?
感谢您的建议
人们看到您的主键或代理键就能够破解数据库的日子已经一去不复返了。现在sql注入和后门的概念已经消失了。我不同意公开主键是个问题的观点。如果你让它们对用户可见,因为它们在系统之外被赋予了意义,这可能是一个问题,这通常是你试图避免的。
但是要使用id作为组合框列表项的值吗?我说,去吧。对中间值进行转换和转换有什么意义呢?您可能没有唯一的密钥可以使用。这样的翻译引入了更多潜在的bug。
只是不要忽视安全。
如果你给用户提供6个项目(ID 1到6),永远不要假设你只会从用户那里得到这些值。有人可能会试图通过发送ID 7来破坏安全,所以你仍然需要验证你返回的内容是允许的。
但是完全避免?不可能。没有必要。
正如另一个答案的评论所说,看看这里的URL。其中无疑包括SO数据库中问题的主键。为技术用途而公开密钥是完全可以的。
同样,如果您确实使用了一些代理值,那也不一定更安全。
一般来说,没有必要对项目id进行加密,因为(在大多数业务领域中)这并不被视为机密信息。除非您的域名特别要求将id保密,否则不要这样做。保持简单,傻瓜。
没有与此相关的安全问题。
在这种情况下,"主键"究竟是什么意思?这个术语是数据库术语。在浏览器中,它只是一个标识符。如果标识符存储在具有主键约束的列中,或者存储在具有唯一索引的列中,在存储之前对其值进行可逆转换或不进行可逆转换,这有什么区别?
暴露标识符显然没有直接风险。
但是与标识符相关的风险可能必须被降低。
例如,您必须确保对标识符的了解并不意味着对已标识资源的完全访问。您可以通过正确地验证和授权所有资源访问来做到这一点。(更新:其他一些答案表明,您可以通过使标识符难以猜测来做到这一点,例如通过加密或签名。这当然是无稽之谈。通过保护资源来保护它,而不是试图隐藏它。在某些情况下,标识符的值可能包含您不想公开的信息。例如,如果您按顺序为您的"订单"编号,并且用户看到他们的订单编号为17,他们就知道您过去收到了多少订单。这可能是你不想暴露的竞争性信息。此外,如果标识符是顺序的,则它们包含有关标识符创建时间的信息,相对于其他标识符。这也可能是保密的。
所以问题不是真正的"我能暴露标识符吗",而是"我应该如何生成标识符,从而不会通过它们暴露机密信息"。
好吧,如果标识资源的数量不是保密的,就使用序列(例如由标识列生成)。如果希望标识符无意义,请使用加密随机数生成器生成它们。
在web应用程序中公开item的ID是没有问题的。
如果您的代码CRUD ajax请求采用ID参数并对其进行处理,那么用户可以很容易地在firebug中调用许多ajax请求。如果你不允许过多的来宾用户,那么这就不是一个大问题。
安全性在这里没有任何意义。您只需记住,所有的代码都是安全的,不受XSS的攻击。
主ID的暴露使人们更容易记住或破解url并转到下一个(项目或页面)。您唯一需要关心的是始终检查安全性(XSS)
我相信将主键暴露给公众是没有风险的,我认为你应该注意漏洞从哪里开始。只要您生成的url是无篡改的,并且您确定给定的url是在您的应用程序中生成的,并且没有中间人,那么一切都很顺利。为了做到这一点,我总是使用哈希风格的机制,并为由主键和其他内容组成的url提供一个额外的参数,以检查是否有篡改。