在我的网站上登录用户可以创建文档,就像在Google文档上一样。该文档可以由用户公开,也可以是私有的(defualt)。文档存储在数据库表中,如下所示:
| id | title | content | public | owner |
| 1 | asd | asd | 1 | 1 |
| 2 | asd | asd | 0 | 1 |
| 3 | asd | asd | 0 | 2 |
如果公共等于1,则可以使用任何用户的链接查看公共文档: site.com/documents/id
问题是,即使文档可以公开,我也不希望用户能够一直将URL增加1来访问所有公共文档:
等等......
那么也许我应该散列ID或类似的东西?像这样:
<?php echo 'site.com/documents/'.md5($id); ?>
问题是,我无法确定它在服务器端的ID,因为它是哈希...
我可以对我的问题做些什么?
答案 0 :(得分:5)
根据您的安全要求,您应确保您的文档ID实际上是随机的且无法猜测。如果您只是对自动递增ID进行哈希处理,结果哈希值可能似乎是随机的,但是一旦有人注意到您只是哈希增加数值(并正确猜测您的哈希算法),就很容易猜到可能的文件ID。
要实现这一点,您可以简单地对随机数进行散列(确保数据库中没有散列冲突),或者使用UUID(有关如何生成它们的示例,请参阅this question)。
为了将散列标识符映射到现有文档,只需将散列与文档一起存储在数据库中(最好使用散列作为主键)。
答案 1 :(得分:0)
你一定要哈希吧。请注意,md5目前还不够安全,所以你可能想看看Sha或Blowfish(即使后者看起来有点过分)。
然后,您只需将哈希值存储在包含文档属性的数据库表中。
否则你可以自己创建一个随机哈希来识别文档并使用它来代替ID(显然检查Murphy没有这样做,所以有两个文件具有相同的哈希)。
答案 2 :(得分:0)
您如何确认所有者正在查看私人文档?
虽然拥有随机ID肯定有助于防止轻松猜测文档ID,但似乎您正在通过默默无闻来看待安全性。
在您的文档控制器中,您需要检查public == 0该owner == $登录用户。在此方法中,您还将验证您的唯一文档ID。
答案 3 :(得分:0)
MD5不适合散列数字,任何人都可以反转数字md5。我会推荐一些更强大的东西,比如SHA。 (您还可以加密整个URL,以获得更高的安全性,因为它不容易破解 - 它不会占用任何额外的空间,因为无论有多少数据被散列,所有散列都是相同的大小)
您需要将哈希值存储在数据库中,并仅将其存储为公共文件。所以任何具有以下URL结构的url:
"site.com/documents/65hd83jd8h..."
您可以在数据库中查找,因为哈希将是唯一的。