2012-02-22 46 views
2

我试图想出一种避免直接使用URL中的ID来查找表条目的好方法。主要原因是出于隐私原因,我不希望我的用户能够简单地将/ unique_id = 10更改为/?unique_id = 11并查看其他人的信息。最好的URL ID实现

我注意到许多网站使用随机生成的字符串,但是这样的最好的结构实现是什么?

谢谢!

哦,我怀疑它的问题,但我使用PHP。编辑: 页面上的信息是公开的信息。也就是说,任何有链接的人都应该能够毫无困难地访问该页面。我想要阻止的是人们只是遍历ID并查看数据库中的所有内容。我更喜欢只有获得链接的人访问该页面。也就是说,如果一个随机的人绊倒它,这不是一个大问题。

此外,我不希望人们看着ID来确定总共有多少个条目。

+2

您显示的信息有多敏感? – 2012-02-22 22:30:34

+0

任何'guid' /'uuid'方法都可以工作,但是您不应该为了安全性而依靠ID的默认值... – Wrikken 2012-02-22 22:33:15

+0

您是否试图限制访问用户自己的信息?如果是这样,我可以建议你根据用户的登录信息使用会话变量吗? – SenorAmor 2012-02-22 22:33:33

回答

3

您可能需要某种用户检查以确保人们无法看到其他人的记录,但使用GUID是一个好的开始。

你可以使用类似record1,record2等的散列,但是一个被确定的黑客很容易做到这一点。

另一个选择是使用记录别名,因此每个记录都有一个字符串表示它,然后将其用作关键字。您经常在wordpress或其他CMS系统中看到这一点。

所以,如果你的ID是指后可能拿冠军,取而代之的空间 -

如。 www.example.com/article.php?id=Summer-is-the-best-time-of-year

+0

我认为字符串解决方案是最好的。假设我只想使用随机字符串,而不是实际的标题。为了避免碰撞,使该字符串唯一是最好的方法? – 2012-02-23 04:51:26

+0

一个GUID!否则你需要使用autoincrement字段结合其他东西,并将其转换为字母,如说123-GHF,则人们可以猜测123位,但不是字母。 – 2012-02-23 10:27:29

0

你可以使用md5(id)加密它们并搜索具有相同md5(id ) ie

select * from table where md5(id) = '$encrypted' 
+1

必须对表中的每一行执行全表扫描并计算md5。如果您的行数超过了几行,性能将会相当差。 – recursive 2012-02-22 22:46:52

2

你不应该在url级别处理。您只需在会话中注意这一点,如果用户123尝试访问yoursite.com/unique_id=456,则会话检查将阻止他执行此操作。我的意思是你说的是私人网页不是吗?

即使你对其进行编码(用户ID),这将是作为一个散列或一些东西,只不过是将混淆更是不为阻止对自己的访问一样好(与会话)

0

访问为什么不使用AJAX调用来查询数据库,而不是将它们包含在URL $ _GET中。

+0

这会如何提高安全性?无论Ajax是否用于请求,客户端仍然可以看到该ID。 – 2012-02-22 23:12:18

+0

AJAX请求对客户端不可见,并且不像URL那样编码,就像通过$ _GET传递的变量 – xXPhenom22Xx 2012-02-23 19:11:14

1

我已经使用了MySQL的UUID()函数,但是您应该使用权限检查来确保用户无法查看其他用户的数据。

This answer只显示了如何创建一个唯一的标识符。

+0

这实际上是我尝试做的完美选择。我不知道这个功能是否存在。谢谢! – 2012-02-23 23:47:30