为什么许多网站(youtube 是一个很好的例子)生成随机数和字母的字符串,而不是使用例如行 id?
通常它是这样的
bla?v=wli4l73Chc0
而不是喜欢
bla?id=83934
如果您有很多行,是否只是为了保持简短?或者还有其他好处吗?因为我可以想象:bla?id=23934234234 看起来不太好
谢谢和欢呼
为什么许多网站(youtube 是一个很好的例子)生成随机数和字母的字符串,而不是使用例如行 id?
通常它是这样的
bla?v=wli4l73Chc0
而不是喜欢
bla?id=83934
如果您有很多行,是否只是为了保持简短?或者还有其他好处吗?因为我可以想象:bla?id=23934234234 看起来不太好
谢谢和欢呼
它们实际上不是随机字符串。通常它们是用 Base-36 编码编码的数字(通常是行 ID)(显然并非总是如此,但有很多使用它)。
他们为什么使用它?因为 Base-36 编码的数字字符串比原始字符串短。
例如: Base-36 中的1234567890是kf12oi,几乎短了 50%。
请参阅此维基百科文章。检查“实践中的使用”部分,看看谁在使用它。
在分布式环境中,为标识符生成随机数比为序号生成更简单。
老实说,我不确定他们为什么不使用唯一 ID(或 ObjectID 或其他取决于什么数据库)所以你有没有想过他们是否不是以 base-10 表示 ID,而是以更高的基数表示它(例如64,或 URL 中的任何功能)以便 ID 在查询字符串上更紧凑?(阅读:wli4l73Chc0
是非基数 10 中的某个数字)
我赞成 Rob 的回答,但我也会详细说明其中一个风险。
如果您发布一个链接,例如为什么网站会为 url 生成随机字母数字字符串而不是使用行 ID?其中 258510 是一个数据库 ID,有人试图破解您的网站将尝试连接到https://stackoverflow.com/questions/2581511。
使用stackoverflow,这可能不是数据库id,而且stackoverflow上的问题不应该是私有的,所以即使是也没什么大不了的。
但是,如果这是一个限制对数据所有者的数据访问很重要的网站,那么这可能会让人们看到他们不应该看到的数据。
当然,如果他们不拥有数据,您可以并且应该做一些事情来使其拒绝显示数据,但最好让 url 不识别数据库 id。正如 Rob 所指出的,最好将散列放入某个更大的域中,或者将基于会话的索引放入已识别为适合向用户显示且仅在登录会话中可用的一组数据中。
我猜这是为了混淆信息并添加/增加可以通过该参数传递的信息量。
在 url 中包含原始行 ID 或其他未修改的数据库参数是不好的安全做法。将散列放入某个大型域中要好得多。
一些环境也使用它来为会话建立状态变量。例如,如果您有一个使用无 cookie 会话的 ASP.Net 应用程序,您会在 URL 中找到类似的代码。