【问题标题】:Best URL ID implementation最佳 URL ID 实施
【发布时间】:2012-03-13 07:59:28
【问题描述】:

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

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

谢谢!

哦,我怀疑这很重要,但我使用的是 PHP。

编辑: 页面上包含的信息是公共信息。也就是说,任何拥有该链接的人都应该能够毫无问题地访问该页面。我想要阻止的是人们简单地遍历 ID 并查看数据库中的所有内容。我更喜欢只有获得链接的人才能访问该页面。也就是说,如果一个随机的人偶然发现它,这不是一个大问题。

另外,我不希望人们通过查看 ID 来确定总共有多少条目。

【问题讨论】:

  • 您显示的信息有多敏感?
  • 任何guid / uuid 方法都可以,但你不应该依赖ID的模糊性来保证安全......
  • 您是否试图限制对用户自己信息的访问?如果是这样,我是否建议您根据用户的登录信息使用会话变量?
  • 我应该更清楚一点:页面上包含的信息是公共信息。也就是说,任何拥有该链接的人都应该能够毫无问题地访问该页面。我想要阻止的是人们简单地遍历 ID 并查看数据库中的所有内容。我更喜欢只有获得链接的人才能访问该页面。也就是说,如果一个随机的人偶然发现它,这不是一个大问题。
  • 哦,我不想让人们知道数据库中有多少条目。使用 ID,他们所要做的就是找到 ID 指向“无效”页面的点,并且他们确切地知道有多少条目。

标签: php


【解决方案1】:

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

您可以使用记录 1、记录 2 等的哈希值,但有决心的黑客可以轻松做到这一点。

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

因此,如果您的 id 指的是帖子,则可以使用标题并将空格替换为 -

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

【讨论】:

  • 我认为字符串解决方案是最好的。假设我只是想使用随机字符串,而不是实际的标题。为了避免冲突,使该字符串唯一的最佳方法是什么?
  • 一个 GUID!否则你需要使用一个自动增量字段结合其他东西并变成像说 123-GHF 这样的人可以猜到 123 位但不能猜到字母的字母。
【解决方案2】:

您可以使用 md5(id) 加密它们并搜索具有相同 md5(id) 的记录 即

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

【讨论】:

  • 这必须对表中的每一行进行全表扫描和计算和 md5。如果您的行数多于几行,性能会比较差。
【解决方案3】:

您不必在 url 级别处理它。您只需在会话中处理此问题,因此如果用户 123 尝试访问 yoursite.com/unique_id=456,会话检查将阻止他执行此操作。我的意思是你在谈论私人页面,不是吗?

即使您对它(用户 ID)进行编码,它也可以作为散列或其他东西进行访问,这只不过是混淆,不如阻止您自己(通过会话)访问

【讨论】:

    【解决方案4】:

    为什么不对数据库的任何查询使用 AJAX 调用,而不是将它们包含在 URL $_GET 中。

    【讨论】:

    • 这将如何提高安全性?无论请求是否使用 Ajax,该 ID 对客户端仍然可见。
    • AJAX 请求对客户端不可见,并且不会像通过 $_GET 传递的变量一样在 URL 中编码
    【解决方案5】:

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

    This answer 简单展示了如何创建唯一标识符。

    【讨论】:

    • 这实际上非常适合我正在尝试做的事情。我不知道该功能存在。谢谢!
    猜你喜欢
    • 2015-06-14
    • 2012-02-23
    • 1970-01-01
    • 2010-09-12
    • 2013-08-30
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多