安全地验证用户的最佳方法是什么? (session,cookies,php,mysql)

时间:2011-03-14 05:07:19

标签: php session authentication cookies

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

到目前为止,我一直在想:

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

有什么风险?

5 个答案:

答案 0 :(得分:2)

我可以在现有框架中看到的唯一问题(我非常喜欢)是$logged可能会发生冲突。

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

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

答案 1 :(得分:1)

首先不需要做

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

启动会话应该是你应该在index.php(被执行的文件)之上放置session_start()的第一件事。这样,默认情况下,无论用户是否登录,都会在用户浏览器上创建cookie名称“phpsessid”。此cookie的值是唯一的,您可以在登录后识别用户。因此您不需要为此目的创建任何其他cookie。

答案 2 :(得分:0)

第一步有点矫枉过正,因为$_SESSION['foo']在会话的生命周期中基本上是客户端。我只是为每个用户存储一个盐渍和哈希的密码,并使用日期或其他伪随机因素进行盐析。

如果用户清除其Cookie或会话过期,则设置cookie可能会失效。这将使用户登录(根据您的数据库)实际上他们不是。

我坚持只使用$_SESSION['foo']和Cookie,并将数据库从登录过程中移除。

答案 3 :(得分:0)

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

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

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

  3. 但是,如果长时间后Salt字符串保留在数据库中,登录后客户端计算机出现电源故障。

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

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

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

    1. 您可以查看已经登录过其他电脑的用户吗?
    2. 如果会话不存在,您可以轻松清除SALT字符串。
    3. 如果电脑电量不足,您可以轻松管理登录

答案 4 :(得分:0)

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