我有一些内容的ID,我有一个url与GET参数如下:id=202
(其中202
是用户想要观看的内容的ID)。我想避免这种情况,并将ID转换为具有随机字符和数字的字符串,就像YouTube一样(例如:watch?v=QEllLECo4OM
),然后将其再次转换为整数,这样我就可以获取内容。
我考虑使用一个包含每个ID和一个字符串的表,每当用户上传新内容时,我生成一个随机字符串并在该表中检查它,以避免重复。
这是唯一的方法吗?或者有没有更好的算法?
谢谢。
有一个库专门用于此任务:hashids。
它不是一个安全库,而是用来混淆数据库中的数字id。
的例子:
$hashids = new Hashids();
$id = $hashids->encode(1, 2, 3); // o2fXhV
$numbers = $hashids->decode($id); // [1, 2, 3]
您可以使用php函数base64_encode (202 => MjAy),然后base64_decode (MjAy => 202)。但如果这是你的意图,这只是有点混淆,而不是"秘密"。
带有ID和随机字符串的表更安全。为什么?
- 没有计算来反转ID
- 没有人可以从外部猜测或重新计算ID
- 没有人知道你已经在数据库中有多少条目作为随机字符串
如果您希望选择一个较短的数字,有选项
- hex ->将整数ID转换为十六进制数15-F(或123123 -> 1E0F3)
- 的替代方案是您自己的转换器,参见将基数10转换为基数62 (a- za - z0 -9)
注。为了使自定义转换器更安全,您可以以不同的方式重新排序Base62数组(0-9,a-z, a-z)中的数字和字符,因此哪个字符获得哪个数字并不明显