在我的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,还是应该在公钥和私钥之间创建映射表?
感谢您的建议
答案 0 :(得分:8)
人们看到您的主要密钥或代理密钥能够破解数据库的日子已经一去不复返了。现在sql注入和后门概念已经消退。 我不同意暴露主键是一个问题的立场。如果您让用户看到它们可能会出现问题,因为它们在系统外部具有意义,这通常是您要避免的。
但是要使用ID作为组合框列表项的值?我说,去吧。从一些中间价值进行翻译有什么意义?您可能没有唯一的密钥可供使用。这样的翻译为bug带来了更大的潜力。
只是不要忽视安全。
如果说您向用户展示了6个项目(ID 1到6),请不要假设您只会从用户那里获得这些值。有人可能会通过发回ID 7来尝试破坏安全性,因此您仍需要验证您获得的内容是否被允许。
但完全避免这种情况?没门。没必要。
作为对另一个答案的评论说,请查看此处的URL。这包括无疑是SO数据库中问题的主要关键。公开用于技术用途的密钥完全没问题。
另外,如果你确实使用了一些代理价值,那就不一定更安全了。
答案 1 :(得分:4)
通常,没有加密项ID的重点,因为这不被认为(在大多数商业领域中)机密信息。除非您的域名明确要求将ID保密,否则请勿执行此操作。保持简单,愚蠢。
没有与此相关的安全问题。
答案 2 :(得分:1)
在这种情况下,“主键”究竟是什么意思?该术语是数据库术语。在您的浏览器中,它只是一个标识符。如果该标识符存储在具有主键约束的列中,或者存储有唯一索引的列,在存储之前对其值进行或不进行某些可逆转换,则会有什么不同?
显然没有暴露标识符的直接风险。
但是标识符存在风险,可能需要减轻这些风险。
例如,您必须确保标识符的知识并不意味着对标识资源的完全访问权限。您可以通过正确验证和授权所有资源访问来实现此目的。 (更新:其他一些答案表明你可以通过标识很难猜测来做到这一点,例如通过加密或签名。当然这是无稽之谈。你通过保护它来保护资源,而不是试图隐藏它。)
在某些情况下,标识符的值可能包含您不想公开的信息。例如,如果您按顺序为“订单”编号,并且用户看到订单编号为17,则他们知道您过去收到的订单数量。这可能是您不想公开的竞争信息。此外,如果标识符是连续的,则它们包含有关何时创建标识符的信息,相对于其他标识符。这也可能是保密的。
所以问题不在于“我能否公开标识符”,而是“我应该如何以不通过它们暴露机密信息的方式生成标识符”。
好吧,如果已识别资源的数量不是机密,只需使用序列(例如,由标识列生成)。如果您希望标识符毫无意义,请使用加密随机数生成器生成它们。
答案 3 :(得分:0)
他们对Web应用程序中项目的ID没有任何问题。
如果您的代码CRUD ajax请求采用ID参数并对其进行处理,那么用户可以非常轻松地在firebug中调用许多ajax请求。如果你不允许访客用户过多,那么这不会是一个大问题。
在这种情况下,安全并不意味着什么。您只记得所有代码都是安全的XSS。
公开主要ID可以让人们更容易记住或破解网址并转到下一个(项目或页面)。您唯一需要注意的是始终检查安全性(此问题的XSS)
答案 4 :(得分:0)
我认为将主键暴露给公众是没有风险的,我认为你应该注意漏洞的起源。只要您生成的网址没有篡改,并且您确定在您的应用程序中生成给定网址并且无中间人,则一切顺利。要做到这一点,我总是使用哈希风格的机制,并为我的网址提供额外的参数,由主键和其他东西组成,以检查篡改。