为什么网站为网址生成随机字母数字字符串而不是使用行ID?

时间:2010-04-05 22:16:48

标签: url youtube identifier

为什么许多网站(youtube是一个很好的例子)生成随机数字和字母的字符串而不是使用例如行ID?

通常它的东西喜欢这个

bla?v=wli4l73Chc0

而非喜欢

bla?id=83934

如果你有很多行,它只是保持简短吗?或者还有其他好处吗?因为我可以想象:bla?id = 23934234234 看起来不太好看

谢谢和欢呼

7 个答案:

答案 0 :(得分:9)

它们实际上不是随机字符串。通常它们是以Base-36编码编码的数字(通常是行ID)(显然不是总是的情况,但有很多人使用它)。

为什么要使用它?因为Base-36编码的数字字符串比原始字符串短。

例如:Base-36中的 1234567890 kf12oi ,差不多缩短了50%。

请参阅此维基百科article。检查“在实践中使用”部分,看看谁在使用它。

答案 1 :(得分:6)

在分布式环境中,为序列号生成标识符的随机数比较简单。

答案 2 :(得分:4)

老实说,我不确定为什么他们不会使用唯一ID(或ObjectID或其他什么,取决于什么数据库)所以你有没有想过如果不是在base-10中表示ID,他们代表它在更高的基础上(例如64,或URL中的任何内容),以便查询字符串上的ID更紧凑? (阅读:wli4l73Chc0是非基数的一些数字)

答案 3 :(得分:4)

我赞成了Rob的回答,但我还会详细说明其中一个风险。

如果您发布了Why do websites generate random alphanumeric strings for urls instead of using row ids?这样的链接,其中258510是数据库ID,那么试图破解您网站的人将尝试连接到https://stackoverflow.com/questions/2581511

使用stackoverflow,这可能不是数据库ID,并且stackoverflow上的问题不应该是私有的,所以即使它不是很重要。

但如果这是一个限制对数据所有者的数据访问权限很重要的网站,那么这可能会让人们看到他们不应该看到的数据。

当然,如果他们不拥有数据,你可以而且应该做的事情是让它拒绝显示数据,但最好还是让网址不能识别数据库ID。正如Rob指出的那样,最好将哈希值放入更大的域中,或者将基于会话的索引转换为已经识别为适合显示用户并且仅在登录会话中可用的数据集。

答案 4 :(得分:3)

我猜这是为了混淆信息并添加/增加可以通过该参数传递的信息量。

答案 5 :(得分:1)

在网址中包含原始行ID或其他未修改的数据库参数是不好的安全措施。散列到某个大域中会好得多。

答案 6 :(得分:0)

某些环境也使用它来为会话建立状态变量。例如,如果您有一个使用无Cookie会话的ASP.Net应用程序,您将在URL中找到类似的代码。