【发布时间】: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 对应的数据库行。
我能想到两种可能的解决方案。我很高兴听到您对哪个更好的意见。如果有更好的解决方案我还没有想到,请告诉我。
在 URL 中包含 ID 的加密版本 - 这将使用户很难仅更改 URL 中的 ID 并猜测另一个用户的加密 ID。 PHP 也很容易在需要时解密 ID,并使用它从数据库中请求用户的数据。
在数据库的“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