为啥网站倾向于在数据库表上使用随机 id:s?

Posted

技术标签:

【中文标题】为啥网站倾向于在数据库表上使用随机 id:s?【英文标题】:Why do web sites tend to use random id:s on database tables?为什么网站倾向于在数据库表上使用随机 id:s? 【发布时间】:2012-06-22 14:20:27 【问题描述】:

我想知道为什么许多网站选择使用随机 id:s 而不是在其数据库表上从 1 递增。我搜索了没有找到任何充分的理由,有吗?

另外,哪种方法最好用?在插入数据之前检查 id 是否已经存在似乎效率很低(需要第二次查询)。

感谢您的帮助!

【问题讨论】:

只是为了避免任何基于增量值集的安全威胁 增加 ids 会泄漏有关交易率的信息,如果这些信息暴露给客户端。例如每天注册的新用户数。 【参考方案1】:

在幕后,他们很可能使用数据库中的增量 ID 来识别行,但通过 URL 参数向最终用户公开的值通常被制成随机字符串,以构成可用对象的序列更难猜。

这确实是一个通过默默无闻的安全问题。它阻碍了自动化脚本继续执行增量值并尝试通过 URL 进行攻击,并且阻碍了对站点内容的自动抓取。

例如,如果 youtube 使用增量 id 而不是 v=HSsdaX4s 之类的值,则只需从 v=1 开始并将该值递增数百万次,即可下载每一个。

【讨论】:

增量ID有什么意义?从表中获取行时,您将使用 v=HSsdaX4s。那么真的需要增量 ID 吗? @lawls 在大规模情况下,索引整数字段可能会节省计算量,特别是考虑到它们可能在许多其他相关表中用作外键列,而不仅仅是主表。但实际上,增量 ID 只是许多 Web 框架和 ORM 的默认行为,以及 RDBMS 生成自动增量 ID 并在 INSERT 之后立即返回它们的本机行为。因此,在小规模下,您只会真正获得不必重新配置 ORM 的便利。您仍然需要编写算法来生成字符串 id。【参考方案2】:

顺序 ID 不能很好地扩展(它们成为分布式系统中的同步瓶颈)。

另外,你不需要检查一个新生成的随机id是否已经存在,你可以假设它不存在(因为它们太多了)。

【讨论】:

【参考方案3】:

您确定 id 是随机的吗?还是它们被编码?无论哪种方式都是为了安全。

【讨论】:

我不知道它们是否是随机的,但 Stack Overflow 就是一个完美的例子。 id 为 1 的问题可能没有问题,据我所知,所有问题的 id:s 为 8 个数字。 @piers - How about this one 或 this one 按日期对问题进行排序,然后转到最后一页。 @MartinSmith 谢谢你,我的错。 @piers 用户也从 1 开始递增。 The founders持有the early numbers

以上是关于为啥网站倾向于在数据库表上使用随机 id:s?的主要内容,如果未能解决你的问题,请参考以下文章