我正试图想出一个很好的方法来避免在URL中直接使用ID来查找表条目。主要原因是出于隐私原因,我不希望我的用户能够简单地将/?unique_id = 10更改为/?unique_id = 11并查看其他人的信息。
我注意到很多网站使用随机生成的字符串,但这样的结构实现最好是什么?
谢谢!
哦,我怀疑这很重要,但我正在使用PHP。
编辑: 页面上包含的信息是公共信息。也就是说,任何拥有该链接的人都应该能够毫无困难地访问该页面。我想要防止的是人们只是遍历ID并查看数据库中的所有内容。我更喜欢只有获得链接的人才能访问该页面。也就是说,如果一个随机的人偶然发现它并不是一个大问题。
此外,我不希望人们查看ID以确定有多少条目。
答案 0 :(得分:3)
您可能需要某种用户检查以确保人们无论如何都没有看到其他人的记录,但使用GUID是一个良好的开端。
你可以使用像record1,record2等的哈希值,但是一个被确定的黑客可以很容易地做到这一点。
另一种选择是使用记录别名,这样每条记录都有一个表示它的字符串,然后将其用作键。您经常在wordpress或其他CMS系统中看到这一点。
因此,如果你的id引用帖子,可以取标题并用 -
替换空格例如。 www.example.com/article.php?id=Summer-is-the-best-time-of-year
答案 1 :(得分:2)
你不应该在网址级别处理这个问题。您只需在会话中处理此问题,因此如果用户123尝试访问yoursite.com/unique_id=456,则会话检查将阻止他执行此操作。我的意思是你在谈论私人网页不是吗?
即使您对其进行编码(用户ID),也可以将其作为哈希或其他东西进行访问,这种混淆只不过是混淆,这不如阻止您自己访问(使用会话)
答案 2 :(得分:1)
我已经使用了MySQL的UUID()
函数,但你绝对应该使用权限检查来确保用户无法查看其他用户的数据。
This answer简单地展示了如何创建一个独特的标识符。
答案 3 :(得分:0)
你可以使用md5(id)加密它们并搜索具有相同md5(id)的记录 即
select * from table where md5(id) = '$encrypted'
答案 4 :(得分:0)
为什么不对数据库的任何查询使用AJAX调用,而不是将它们包含在URL $ _GET中。