【问题标题】:Including obscured IDs in the URL在 URL 中包含隐藏的 ID
【发布时间】:2018-07-05 03:32:40
【问题描述】:

我需要在 URL 中包含用户 ID,如下所示:

http://www.example.com/user.php?id=123456

但是,有一个问题。例如,如果用户手动将 URL 中的 ID 更改为 123455,这可能会导致数据库的错误更新。

出于这个原因,我需要以某种方式使 URL 中的 ID 对用户不可读,这样他们就不能只从 ID 中减去 1 并能够更改其他用户的数据。

另一个要求是 URL 中的 ID 必须可用,这意味着无论我们对它做什么,PHP 都必须有办法找出与该特定 ID 对应的数据库行。

我能想到两种可能的解决方案。我很高兴听到您对哪个更好的意见。如果有更好的解决方案我还没有想到,请告诉我。

  1. 在 URL 中包含 ID 的加密版本 - 这将使用户很难仅更改 URL 中的 ID 并猜测另一个用户的加密 ID。 PHP 也很容易在需要时解密 ID,并使用它从数据库中请求用户的数据。

  2. 在数据库的“users”表中添加一个名为“hash”的新列。正如您可能已经猜到的那样,每个用户都会有一个唯一的随机散列或 UUID 存储在数据库中,该 UUID 将包含在 URL 中。这使得猜测另一个用户的哈希值变得非常不可能。 PHP 可以通过在数据库查询中使用哈希来轻松检索用户的数据。

【问题讨论】:

  • 混淆从不是解决安全问题的方法。
  • @arkascha 我不会说永远不会。假设您需要向用户公开提供链接,并且没有访问级别的用户应该能够查看它们。拥有一个相当模糊的链接是有益的,这样他们就不能轻易查看其他人,但是应该有权访问该链接的人会得到一个验证/允许他们查看的人。
  • @FrankerZ 您所描绘的不是身份验证方案,而是试图通过混淆来阻止大多数用户。这与身份验证或授权无关。自包含的公共链接永远不能被视为一种保护。 例如,它可以简单地发布到论坛。
  • @arkascha 如果发布到论坛,用户仍然无法找到其他链接(用户可以通过获取链接来做他们想做的事)。 Google 使用这种精确的方法为 google 文档提供可共享链接。
  • @Jeff 只要确保您使用难以猜测的哈希值。不要简单地使用md5(id)sha256(id)。在字符串上添加一个长盐,这样用户就不能简单地推断哈希值并回溯它。 IE。 sha256('thisIsAReallyLongStringWithNumb3ersAnd$pecial©haracters' . $id)

标签: php mysql url encryption hash


【解决方案1】:

例如,如果用户手动将 URL 中的 ID 更改为 123455,则可能会导致数据库更新错误。

解决这个问题的方法是在服务器上进行健全性检查,这样用户就不能错误地更新数据库。您要么需要某种权限检查(“不允许此用户更新此记录”),要么需要其他一致性检查以确保不会错误地进行更新(“通常允许用户更新此记录,但现在它会引起与其他事物的冲突,所以我们不会”)。

您必须在 URL 中包含 一些 id,并且用户将始终能够更改该 id。充其量,您可以通过使用连续编号以外的其他方式使有效 id 更难猜测,但这并不能解决您的服务器没有健全性检查的根本问题。不要因为产生错误而责怪用户,这是您的代码允许的。

【讨论】:

  • 在几乎所有其他情况下,都可以进行健全性检查,但在这种情况下则不行。想想 bit.ly 和类似的网站。他们无法进行任何检查,因为他们必须将内容提供给具有有效链接的任何人。同时,他们使用哈希,这使得猜测其他人的缩短链接变得困难。最后,我决定使用与 ID 一起存储在数据库中的随机 24 个字符的十六进制哈希。这对我的用例来说足够安全和​​方便。
  • 如果没有可能的检查可以强制执行,那么“错误”的定义充其量是模糊的。如果允许用户访问特定链接,那么他们访问该链接就不会是错误的。您可能没想到他们会访问该链接,但您也没有阻止它。是的,如果您不希望他们简单地枚举所有可能的链接,那么像长十六进制字符串这样的难以预测的 id 会有所帮助。
  • 感谢您的意见,非常感谢。我想你是对的。 “意外”或“不想要”是比“错误”更好的词选择。
【解决方案2】:

您应该为此使用会话,而不是 GET[] 参数,会话是此作业的工具。您可以尝试您想到的解决方案,但从我的角度来看,使用会话会更好,更易于使用和实施。

但是,如果您需要执行经典的“恢复我的帐户”之类的操作,因此您无法登录您的用户,您可以在 URL 中使用哈希并通过电子邮件发送给“确保”您的用户是获取 URL 的人。

【讨论】:

  • 必须在网址里,不能使用会话,也不能发邮件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 2012-07-11
相关资源
最近更新 更多