使用 Cookie 和 Salted Hashes 的 PHP 登录系统
题
我正在开发一个基于 PHP 的登录系统。每个用户都有一个 ID(数字)和密码,它们存储为加盐哈希。
我能够确定登录是否成功,但现在我需要将该信息存储在某处(以便用户不会永久注销)。
过去,我使用过 $_SESSION 变量。然而,当用户离开浏览器时,这些似乎会被删除,这是不希望的。另外,我不能“假设”用户不会尝试欺骗系统,因此它必须是安全的。
所以,这是我的问题:
- 我应该使用
$_SESSION
或者$_COOKIE
?这些方法的主要优点是什么? - 如何实现“记住我”复选框?
- 哪些信息应该存储在 session/cookie 变量中?
请注意,在此特定问题中没有考虑数据库安全问题。
关于第三点,我的意思是:
- 我应该将用户的 ID 和散列密码存储在 cookie/会话中,还是
- 我应该将用户的 ID 和非哈希密码存储在 cookie/会话中,还是
- 我应该存储“SessionID”和密码(散列还是非散列?)或
- 我应该存储“SessionID”、“ID”和密码(再次,散列或非散列)吗?
我希望我的网站尽可能安全、高效且用户友好。如果采用基于 SessionID 的方法,我还希望获得一些有关如何将其存储在数据库中的解释。
先感谢您
编辑:伊兰和布莱恩的答案加起来似乎就是我所需要的。不幸的是,我只能将其中之一标记为已接受。我将尝试继续实施,看看哪一个更有用。
其他提示
对于敏感信息(即身份验证结果),仅使用会话。会话存储在服务器端,并且不太可能受到损害。
关于会话生命周期,默认是浏览器会话的生命周期 - 但您可以控制它。有几个设置会影响它:
session.gc_maxlifetime - 有效控制会话的生命周期。
session.gc_probability 和 session.gc_divisor 一起确定会话垃圾收集发生的频率。
最后 - session.cookie_lifetime 控制会话 cookie 的生命周期(保存会话 id 的 cookie,因此不必通过 URL 传输)。它应该与 session.gc_maxlifetime 的值匹配。
另外,切勿将密码存储在会话或 cookie 中(即使是散列格式)。只是认证的结果。
将 ID 存储在 $_SESSION 中,但不存储散列或非散列密码。一旦用户登录并且 ID 保存在 $_SESSION 中,您就不再需要密码了。