在网址

时间:2018-01-25 19:23:57

标签: php mysql url encryption hash

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

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

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

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

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

我能想到两种可能的解决方案。我很高兴听到你对哪一个更好的看法。如果有一个我没想到的更好的解决方案,请告诉我。

  1. 在网址中加入ID的加密版本 - 这会使用户极难更改网址中的ID并猜测其他用户的加密ID。 PHP在需要时也可以轻松解密ID,并使用它从数据库中请求用户的数据。

  2. 添加名为" hash"的新列在"用户"数据库中的表。您可能已经猜到,每个用户都将拥有一个存储在数据库中的唯一随机哈希或UUID,它将包含在URL中。这使得猜测另一个用户的哈希非常不可能。 PHP可以通过使用数据库查询中的哈希轻松检索用户的数据。

2 个答案:

答案 0 :(得分:2)

  

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

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

您必须在网址中包含部分 ID,并且用户始终可以更改该ID。充其量,你可以通过使用连续编号以外的东西来使有效的ID更难猜测,但这并不能解决服务器没有健全性检查的根本问题。不要误导用户产生错误,这是你的代码允许它。

答案 1 :(得分:1)

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

但是,如果你需要做一些类似经典的事情"恢复我的账户"所以你没有办法登录你的用户,你可以在URL中使用哈希并通过电子邮件发送给"确保"您的用户就是获得该网址的用户。