Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 我应该混淆用户的数据库ID吗?_Database_Obfuscation - Fatal编程技术网

Database 我应该混淆用户的数据库ID吗?

Database 我应该混淆用户的数据库ID吗?,database,obfuscation,Database,Obfuscation,有人告诉我,我不应该在web应用程序的HTML代码中直接使用数据库ID 目前,我在诸如表行ID(tableRow-454,其中454是数据库中行的ID)、表单或URL中的隐藏字段或选择字段中使用ID。(我不是指在页面上直观地告诉人们他们是。) 我得到的建议是使用一些数学来模糊用户的ID。我认为这只会让事情变得更复杂,增加不必要的复杂性。但是我可以看到一些很好的理由,使得从HTML确定数据库ID变得更加困难 您是否混淆了用户的ID?或者你在乎吗?是的,你也许应该在乎 如果用户恶意更改这些ID,您的

有人告诉我,我不应该在web应用程序的HTML代码中直接使用数据库ID

目前,我在诸如表行ID(tableRow-454,其中454是数据库中行的ID)、表单或URL中的隐藏字段或选择字段中使用ID。(我不是指在页面上直观地告诉人们他们是。)

我得到的建议是使用一些数学来模糊用户的ID。我认为这只会让事情变得更复杂,增加不必要的复杂性。但是我可以看到一些很好的理由,使得从HTML确定数据库ID变得更加困难


您是否混淆了用户的ID?或者你在乎吗?

是的,你也许应该在乎

如果用户恶意更改这些ID,您的代码是否会检查以确保他们请求的数据仍然是允许他们查看的数据

隐藏ID比在所有地方手动进行验证更容易

编辑,这次要清楚:

如果您向屏幕显示ID为1到20的列表,则很容易验证响应是否在1到20之间。如果在屏幕上显示实际的ID,则需要花费内存缓存ID,或者需要进行另一个数据库调用/更长的查询,以确保它们不会提供坏数据


如果您使用代理ID,我认为这会变得更容易。

不,您只是在为自己做额外的工作

只要你做了足够的测试,在这里或那里更改ID不会让用户访问他们不应该访问的东西,那么你就可以看到ID


在某些情况下,隐藏它们或使用非连续数字,或者可能不从零开始计数,都是有益的。例如,如果有人收到订单号3,他们可能会开始问问题……

我不喜欢向用户公开任何有关数据内部的内容,但是通常会发生这种情况,尤其是在创建基于数据源的下拉列表时。我的解决方案是在表上设置不同的标识规范,以消除递增攻击,并在可能的情况下加密querystring值。考虑到.NET中非常流行的MVC URL模式,这并不总是可能的,因此我倾向于使用唯一的列名,然后对URL进行规范化。然后在数据库中查找该值。但是,没有简单的方法可以完全解决这个问题。

我想说,如果该ID对用户有任何意义,并且您正在处理一个数据敏感的应用程序,那么您应该隐藏该ID的值。更重要的是,我建议您验证当前用户是否可以通过URL访问他们请求的数据。例如,如果您有一个类似mysite.com/account/view/12的URL,那么当前用户是否有权访问该帐户ID(即12)


如果信息是公开的且不敏感,我会说不需要隐藏ID值。

您应该对用户隐藏数据库ID

为什么??这是一个他们(用户)不需要关心的实现细节。我的身份证是123311122?谁在乎!(除非,也许我在ICQ上)。例如,看看这样做如何最小化(但不消除)暴露

其次,使用可预测的ID也是另一种攻击手段,即隐蔽性安全,但它仍然是另一种有效的工具。我从来没有在软件上工作过,但这一直是一个问题


也就是说,如果您的框架没有提供处理“隐藏ID”的方法,或者没有提供干净的映射,那么切换可能就不值得了。

我想说,总体上是可以的,但是有一些问题:

  • 如果你的数字是连续的,你会打开“猜谜游戏”(例如,用户将详细信息?id=4511更改为详细信息?id=4512以查看其他人的详细信息)。要解决这个问题,首先需要适当的安全措施。但在某些情况下,这还不够,因为披露信息的存在本身可能是一个问题。以Youtube为例,他们使用更多分散的id:s来避免机器人屏幕被刮伤

  • 如果您对id:s的性质做出假设,您可能会遇到麻烦(即,如果您直接在GUI中操作id:s或根据id对项目进行排序)。一旦你需要负载平衡你的数据库并最终得到不同的id范围,这可能是一个令人讨厌的惊喜

  • ID重用。例如,MySql:s InnoDB引擎在重新启动时重置序列(到最新的最大值)。如果你这样做的话,这会让你很难受


但所有这些陷阱也适用于自定义id:s,但可能正是这些人的来源。在我看来,最灵活的解决方案是GUID:s,因为您可以在任何地方生成它们,并且不会遇到上述任何问题。但是,人类很难读懂它们,所以这是一种折衷。

我建议你使用友好的名字。它更现代,更具语义。另外,当你创建一个链接时,它看起来更好

例如,考虑MyStutial/Studio。ASPX?ID=25 vs MyStuts/产品/法拉利。后者更干净,更容易记忆(对于用户),等等


如果当前正在隐藏字段中使用ID,请尝试使用会话存储这些值。如果您只在您提到的表行ID中使用它们,我认为不值得花时间隐藏它们。

IMO:不,您不应该混淆ID。如果您的应用程序担心安全问题,那么您仍然需要其他安全措施。默默无闻的安全感是不够的,它只会给你一种虚假的安全感

顺便说一句,如果你只做一点数学计算,其他ID(也被模糊了)仍然是可预测的。在许多情况下,坏人不在乎他闯入哪个账户,只要它不是他自己的;-)

如果您希望您的用户能够走这条路。所有URI:s都是公共的,这取决于响应