安全验证用户身份的最佳方法是什么?(会话、cookies、php、mysql)

安全验证用户身份的最佳方法是什么?(会话、cookies、php、mysql),php,session,authentication,cookies,Php,Session,Authentication,Cookies,安全验证用户身份的最佳方法是什么 到目前为止,我一直在想: 为每个成功登录生成一个随机的$SALT,并将$logged=md5($hashed_password.$SALT)存储到数据库中;注销时删除 将$logged存储到cookie中(如果用户选中“记住我”)。设置$\u会话['user']=$logged 访问时:检查是否设置了$\u会话['user'];如果不匹配,请检查cookie,如果数据不匹配,请重定向到login页面 风险是什么?第一步有点过头了,因为这是会话['foo']在

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

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

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

风险是什么?

第一步有点过头了,因为这是会话['foo']
在会话生命周期内客户端基本上做的事情。首先,我会为每个用户存储一个经过加密和哈希处理的密码,加密日期或其他伪随机因素

如果用户清除了cookie,或者会话过期,那么设置cookie可能会被证明是无用的。这会让用户登录(根据您的数据库),而实际上他们没有登录


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

我能看到的现有框架的唯一问题是
$logged
存在冲突的可能性

从数学上讲,两个有效的用户登录产生相同的哈希并非不可能。因此,我将确保开始在Cookie中存储用户
id
或其他一些独特的信息


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

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

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

  • 是的,这对于已登录或未登录的签出用户非常有用

  • 但是,如果登录后客户端机器出现电源故障,则盐字符串在数据库中保留很长时间

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

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

    认证的最佳方式是将您提到的第1点和第3点结合起来

  • 您可以检查用户是否已从其他pc登录
  • 若会话不存在,您可以轻松清除SALT字符串
  • 在电脑断电的情况下,您可以轻松管理登录
  • 首先不需要做什么

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

    启动会话应该是您应该做的第一件事,将
    session\u start()
    放在index.php(执行的文件)的顶部。这样,默认情况下,在用户浏览器上创建cookie名称“phpsessid”,与用户是否登录无关。此cookie的值是唯一的,您可以通过该值在用户登录后识别该用户。因此,您不需要为此目的创建任何其他cookie。

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

    冲突不是问题,因为我可以在保存数据库之前检查它,并生成另一个salt,直到找到一个打开的位置。谢谢你指出这一点。所以。。如果用户选中“记住我”,登录并重新启动浏览器,会发生什么情况?我想他会被注销是的,你是对的,浏览器会删除cookie phpsessid(php通过它来识别用户),你可以手动测试删除“phpsessid”,刷新时你会被记录。确切地说:)。。。。我假设,如果用户选中“记住我”,他希望登录一次,并以这种方式保持数小时、数天、数周。。直到他决定退出。除了在用户的机器上存储一个唯一的令牌之外,我没有看到任何其他方法。不完全是这样,如果你在选中“记住我”后重新启动浏览器,google、facebook也会忘记用户。不,他们不会。检查您的浏览器设置,可能您正在删除退出时的所有cookie您会验证用户身份并“将数据库排除在登录过程之外”吗?你有点。。。必须以某种方式检查他的密码..,检查用户是否在第二次访问时登录到计算机,并在用户通过身份验证后获取用户的信息..您提到您希望在数据库中临时存储哈希和salt密码并删除它们。您仍然需要在数据库中使用密码(我想是经过盐渍和哈希处理的?如果没有,我只会在数据库中使用
    md5(用户名+密码+全局盐渍)
    ),但不要将数据库用于像这样的临时事情。这就是
    $\u会话['foo']
    的用途。仍然存在这样的问题:如果用户删除了他们的cookie怎么办?