在url php中哈希id

law*_*wls 2 php

登录我网站上的用户可以创建文档,就像在Google Docs上一样.该文档可以由用户公开,也可以是私有的(defualt).文档存储在数据库表中,如下所示:

| id | title | content | public | owner |
| 1  | asd   | asd     | 1      |  1    |
| 2  | asd   | asd     | 0      |  1    |
| 3  | asd   | asd     | 0      |  2    |
Run Code Online (Sandbox Code Playgroud)

如果公共等于1,则可以使用来自任何用户的链接查看公共文档:site.com/documents/id

问题是,即使文档可以公开,我也不希望用户能够一直将URL增加1来访问所有公共文档:

  • site.com/documents/1
  • site.com/documents/2
  • site.com/documents/3

等等...

那么也许我应该散列ID或类似的东西?像这样:

<?php echo 'site.com/documents/'.md5($id); ?>
Run Code Online (Sandbox Code Playgroud)

问题是,我无法弄清楚它在服务器端的ID是什么,因为它是散列的......

我能对我的问题做些什么?

hel*_*ert 5

根据您的安全要求,您应确保文档ID实际上是随机的,不可猜测.如果您只是对自动递增ID进行散列,则生成的散列可能看起来是随机的,但是一旦有人注意到您只是散列增加的数值(并正确猜测您的散列算法),就很容易猜到可能的文档ID.

要实现这一点,您可以简单地对随机数进行哈希处理(确保数据库中没有哈希冲突),或者使用UUID(请参阅此问题以获取有关如何生成它们的示例).

为了将散列标识符映射到现有文档,只需将散列与文档一起存储在数据库中(最好使用散列作为主键).