繁体   English   中英

我应该在ASP.NET MVC视图中公开主键

[英]Should I expose primary keys in ASP.NET MVC views

在我的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作为组合框列表项的值? 我说,去吧。 从一些中间价值进行翻译有什么意义? 您可能没有唯一的密钥可供使用。 这样的翻译引入了更多的漏洞潜力。

只是不要忽视安全。

如果说你向用户展示了6个项目(ID 1到6),那么永远不要假设你只会从用户那里获得这些值。 有人可以通过发回ID 7来尝试破坏安全性,因此您仍然需要验证您获得的内容是否被允许。

但完全避免这样做? 没门。 没必要。

正如对另一个答案的评论所说,请查看此处的URL。 这包括无疑是SO数据库中问题的主要关键。 公开用于技术用途的密钥完全没问题。

此外,如果您确实使用了一些代理值,那不一定更安全。

通常,没有加密项ID的点,因为这不被认为(在大多数商业领域中)机密信息。 除非您的域名特别要求将id保密,否则请勿这样做。 保持简单,愚蠢。

没有与此相关的安全问题。

在这种情况下,“主键”究竟是什么意思? 该术语是数据库术语。 在您的浏览器中,它只是一个标识符。 如果该标识符存储在具有主键约束的列中,或者存储有唯一索引的列,在存储之前对其值进行或不进行某些可逆转换,则会有什么不同?

暴露标识符显然没有直接风险。

但是存在与标识符相关的风险,可能必须减轻这些风险。

例如,您必须确保标识符的知识并不意味着对标识的资源的完全访问权限。 您可以通过正确验证和授权所有资源访问来实现此目的。 (更新:其他一些答案表明,您可以通过使标识符难以猜测,例如通过加密或签名来实现。当然,这是无稽之谈。您通过保护资源来保护资源,而不是试图隐藏它。)

在某些情况下,标识符的值可能包含您不希望公开的信息。 例如,如果您按顺序为“订单”编号,并且用户看到订单编号为17,则他们知道您过去收到的订单数量。 这可能是您不想公开的竞争信息。 此外,如果标识符是连续的,则它们包含有关何时创建标识符的信息,相对于其他标识符。 这也许是保密的。

所以问题不是真的“我可以公开标识符”,而是“我应该如何以不通过它们暴露机密信息的方式生成标识符”。

好吧,如果识别出的资源数量不是保密的,只需使用序列(例如,由标识列生成)。 如果您希望标识符毫无意义,请使用加密随机数生成器生成它们。

他们对Web应用程序中的项目ID没有任何问题。

如果您的代码CRUD ajax请求获取ID参数并对其进行处理,那么用户可以非常轻松地在firebug中调用许多ajax请求。 如果您不允许访客用户过多,那么这不会是一个大问题。

在这种情况下,安全性并不意味着什么。 您只记得所有代码都是安全的XSS。

暴露主要ID使人们更容易记住或破解网址并转到下一个(项目或页面)。 您唯一需要关心的是始终检查安全性(此问题的XSS)

我认为将主键暴露给公众是没有风险的,我认为你应该注意漏洞的起源。 只要您生成的网址没有篡改,并且您确定在您的应用程序中生成给定网址并且无中间人,则一切顺利。 要做到这一点,我总是使用散列样式的机制,并为我的网址提供额外的参数,由主键和其他东西组成,以检查篡改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM