3

在我的网站上登录的用户可以创建文档,就像在 Google Docs 上一样。该文档可以由用户公开,或私有(默认)。文档存储在这样的数据库表中:

| id | title | content | public | owner |
| 1  | asd   | asd     | 1      |  1    |
| 2  | asd   | asd     | 0      |  1    |
| 3  | asd   | asd     | 0      |  2    |

如果 public 等于 1,它是一个公共文档,可以通过任何用户的链接查看:site.com/documents/id

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

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

等等...

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

<?php echo 'site.com/documents/'.md5($id); ?>

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

我能做些什么来解决我的问题?

4

4 回答 4

5

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

为此,您可以简单地散列随机数(确保数据库中没有散列冲突),或使用 UUID(有关如何生成它们的示例,请参阅此问题)。

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

于 2013-02-17T15:56:42.643 回答
0

MD5 不适用于散列数字,任何人都可以反转数字 md5。我会推荐一些更强大的东西,比如 SHA。(您还可以加密整个 URL,以提高安全性,因为它不容易被破解 - 它不会占用任何额外的空间,因为无论散列多少数据,所有散列的大小都是相同的)

您需要将哈希存储在数据库中,并且仅将其存储用于公共文件。因此,任何具有以下 URL 结构的 url:

"site.com/documents/65hd83jd8h..."

您可以在数据库中查找,因为哈希是唯一的。

于 2013-02-18T12:45:46.140 回答
0

您如何验证所有者正在查看私人文档?

虽然拥有随机 ID 肯定有助于防止轻易猜测文档 ID,但您似乎正在通过默默无闻来看待安全性。

在您的文档控制器中,您需要检查是否 public == 0 that owner == $logged in user。在此方法中,您还将验证您的唯一文档 ID。

于 2013-02-17T16:06:55.327 回答
0

你绝对应该散列它。请注意,如今 md5 不够安全,因此您可能想看看 Sha 或 Blowfish(即使后者在那里看起来有点矫枉过正)。

然后,您只需将哈希存储在包含文档属性的数据库表中。

否则,您可以自己创建一个随机散列来识别文档并使用它而不是 ID(并且显然检查墨菲没有做到,因此有两个具有相同散列的文档)。

于 2013-02-17T15:50:14.390 回答