Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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 如何从整数中获取唯一的短字符串?_Database_String - Fatal编程技术网

Database 如何从整数中获取唯一的短字符串?

Database 如何从整数中获取唯一的短字符串?,database,string,Database,String,比如说,我有一个带整数PK的客户。在我的网络应用中,我想为它们创建一个个人资料页面。我不想要像/profile/10375这样的url/(例如,我不想让别人知道我有多少客户)。我也不想要像/profile/acme\u corp/这样的slug基url 将唯一整数转换为唯一随机短字符串的好方法是什么?(例如,早期的Reddit使用这种类型的URL,但它是从十进制到基数36的转换,跳过了一些ID)。但这对我来说也没用,因为用这个方案很容易猜出数据库中实体的数量 我不能使用UUID等,因为它们会使u

比如说,我有一个带整数PK的客户。在我的网络应用中,我想为它们创建一个个人资料页面。我不想要像/profile/10375这样的url/(例如,我不想让别人知道我有多少客户)。我也不想要像/profile/acme\u corp/这样的slug基url

将唯一整数转换为唯一随机短字符串的好方法是什么?(例如,早期的Reddit使用这种类型的URL,但它是从十进制到基数36的转换,跳过了一些ID)。但这对我来说也没用,因为用这个方案很容易猜出数据库中实体的数量


我不能使用UUID等,因为它们会使url太大。

您可以始终使用base64然后url对id进行编码

在php中:

urlencode (base64_encode("1234"))
> MTIzNA%3D%3D

base64_decode(urldecode("MTIzNA%3D%3D"))
> 1234

如果主要关注的是一个客户可以查看另一个客户的页面,那么我不会依赖于您提出的方法。归根结底,这是“默默无闻的安全”。相反,我会将页面的显示与客户的身份验证凭据联系起来(前提是您需要用户登录)。如果客户尝试访问他们自己以外的配置文件页面,他们会重定向到登录页面或发送访问授权错误消息


事实上,您甚至不需要在URL中包含customerID。只需使用/profile/

也许您可以将字母表中的一对随机字母关联到每个数字…

最简单、最安全的方法是创建一个从客户id映射到唯一随机字符串的查找表

有一些哈希算法可以生成短(8个字符,0-9a-f)输出字符串,例如
adler32
crc32
。您可以使用生成它们(请参阅以获取可用算法的列表),但我不确定您的DB引擎本身是否能够处理它。如果是这样的话,生成随机段塞将是一个更好的解决方案


散列时添加盐,这样更安全。

+1你说得对。这是正确的方法,这就是答案。也许只是我,但这似乎太明显了!OP实际上并没有说明问题在于是否有人可以查看其他人的个人资料。提到的唯一问题是不想让人们知道有多少用户。如果无法查看其他配置文件,这是一个很好的解决方案;如果不是……是的,一个人可以查看其他人的个人资料(例如通过浏览网站)。它们是公开的。我主要考虑的是,我不想泄露url中使用的pk,主要原因有两个。1.所以有些人不能下一步查看所有的配置文件,或者让机器人很容易猜到所有的URL等等。为了防止客户数量成为公开信息。如果你真的想这样做,你最好确保生成的字母组合不等于或非常类似于冒犯性词语。祝你好运为了澄清,个人资料是公开的。我想这样做的主要原因是,1。所以有些人不能下一步查看所有的配置文件,或者让机器人很容易猜到所有的URL等等。为了防止客户数量成为公开信息,他还可以使用输出更长的哈希函数,只取前N个字节。