【问题标题】:What is the best way to securely authenticate a user ? (session, cookies, php, mysql)安全地对用户进行身份验证的最佳方法是什么? (会话、cookies、php、mysql)
【发布时间】:2011-03-14 05:07:19
【问题描述】:

安全验证用户身份的最佳方式是什么?

到目前为止,我在想:

  • 为每次成功登录生成一个随机$SALT,并将$logged = md5($hashed_password.$SALT)存入数据库;注销时删除。
  • $logged 存储到cookie 中(如果用户选中“记住我”)。设置$_SESSION['user'] = $logged;
  • 访问时:检查是否设置了$_SESSION['user'];如果没有,检查cookie,如果数据不匹配,重定向到login页面。

有什么风险?

【问题讨论】:

标签: php session authentication cookies


【解决方案1】:

我可以看到您现有框架的唯一问题(我喜欢其他)是$logged 存在冲突的可能性。

两个有效的用户登录产生相同的哈希在数学上并非不可能。所以我会确保开始在 Cookie 中存储用户 id 或其他一些唯一信息。

您可能还希望保留 $logged 被放入数据库的时间戳,以便您可以运行早于 x 天/周的清理查询。

【讨论】:

  • 碰撞不是问题,因为我可以在保存之前检查数据库,并生成另一个盐,直到我找到一个空位。感谢您指出这一点。
【解决方案2】:

第一步有点矫枉过正,因为这就是$_SESSION['foo'] 在会话生命周期内基本上在客户端所做的事情。我只是为每个用户存储一个加盐和散列的密码开始,用日期或其他伪随机因素加盐。

如果用户清除他们的 cookie 或会话过期,设置 cookie 可能会被证明是无用的。这将使用户保持登录状态(根据您的数据库),而实际上他们并没有。

我会坚持只使用 $_SESSION['foo'] 和 cookie,并将数据库排除在登录过程之外。

【讨论】:

  • 您将如何验证用户身份并“将数据库排除在登录过程之外”?你有点......必须以某种方式检查他的密码......,检查用户是否在第二次访问时登录了计算机,并在他通过身份验证后获取用户的信息......
  • 您提到您想在数据库中临时存储散列和加盐密码并删除它们。您仍然需要在数据库中保存密码(我认为是加盐和散列的密码?如果没有,我只使用md5(username + password + global_salt)),但不要将数据库用于此类临时操作。这就是$_SESSION['foo'] 的用途。
【解决方案3】:

首先不用做

Store $logged into a cookie (If user checked "remember me")

开始会话应该是您应该做的第一件事,将session_start() 放在您的 index.php(被执行的文件)之上。这样,默认情况下会在用户浏览器上创建一个 cookie 名称“phpsessid”,而与天气用户是否登录无关。此 cookie 的值是唯一的,您可以在登录后识别用户。因此您无需为此创建任何其他 cookie。

【讨论】:

  • so.. 如果用户选中“记住我”,登录并重新启动浏览器会发生什么?我想他会被注销
  • 是的,你是正确的浏览器删除cookie phpsessid(通过php识别用户),你可以手动测试删除“phpsessid”,你将在刷新时注销。
  • 完全正确 :) .... 我假设,如果用户选中“记住我”,他想登录一次,并保持这种状态数小时、数天、数周……直到他决定登出。除了在用户的机器上存储一个唯一的令牌之外,我没有看到任何其他方法。
  • 不,不完全是,如果你重新启动浏览器,即使你勾选了“记住我”,谷歌、Facebook 也会忘记用户
  • 不,他们没有。检查您的浏览器设置,也许您在退出时删除了所有 cookie
【解决方案4】:

在您提到的第一点中,它在用户登录时创建随机 SALT 字符串,并在用户注销时清除它。

  1. 主要问题是您必须检查页面的每个重定向中是否存在 SALT 字符串。因此它会在数据库服务器中造成大量流量。

  2. 是的,这对于结帐用户是否已登录非常有用。

  3. 但是如果Salt字符串长时间保留在数据库中,登录后客户端机器断电。

在 cookie 中进行用户身份验证的第二点是不安全的。客户端可以轻松在浏览器中显示身份验证cookie

第三点将身份验证存储在会话中,这意味着在服务器端创建会话变量并将其存储在服务器端的文件中。非常安全,然后将其存储在 cookie 中。

验证的最佳方法是将您提到的第 1 点和第 3 点结合起来。

  1. 你可以检查用户是否已经从其他电脑登录?
  2. 如果会话不存在,您可以轻松清除 SALT 字符串。
  3. 在电脑断电时,您可以轻松管理登录

【讨论】:

    【解决方案5】:

    我可以看到一个问题 - 对于同时在多个浏览器中加载您的网站的人来说,您的解决方案听起来很烦人。

    【讨论】:

      猜你喜欢
      • 2012-02-25
      • 1970-01-01
      • 2015-08-10
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      相关资源
      最近更新 更多