我正在开发一个基于 PHP 的登录系统。每个用户都有一个 ID(数字)和密码,它们存储为加盐哈希。

我能够确定登录是否成功,但现在我需要将该信息存储在某处(以便用户不会永久注销)。

过去,我使用过 $_SESSION 变量。然而,当用户离开浏览器时,这些似乎会被删除,这是不希望的。另外,我不能“假设”用户不会尝试欺骗系统,因此它必须是安全的。

所以,这是我的问题:

  1. 我应该使用 $_SESSION 或者 $_COOKIE?这些方法的主要优点是什么?
  2. 如何实现“记住我”复选框?
  3. 哪些信息应该存储在 session/cookie 变量中?

请注意,在此特定问题中没有考虑数据库安全问题。

关于第三点,我的意思是:

  • 我应该将用户的 ID 和散列密码存储在 cookie/会话中,还是
  • 我应该将用户的 ID 和非哈希密码存储在 cookie/会话中,还是
  • 我应该存储“SessionID”和密码(散列还是非散列?)或
  • 我应该存储“SessionID”、“ID”和密码(再次,散列或非散列)吗?

我希望我的网站尽可能安全、高效且用户友好。如果采用基于 SessionID 的方法,我还希望获得一些有关如何将其存储在数据库中的解释。

先感谢您

编辑:伊兰和布莱恩的答案加起来似乎就是我所需要的。不幸的是,我只能将其中之一标记为已接受。我将尝试继续实施,看看哪一个更有用。

有帮助吗?

解决方案

我想重申伊兰的观点 绝不 将用户密码甚至密码的哈希值存储在会话或 cookie 数据中。

一般来说,我已经使用 Cookie 在网络应用程序中实现了“记住我”功能。有关构建“安全”持久登录系统的信息的一个好地方是这里 关于鱼缸的博客文章. 。深入的答案已经涵盖在 另一个堆栈溢出答案.

如果您需要确保登录安全,则必须使用 https。这是因为如果未加密,cookie 或会话可能会被盗。

另一个值得遵循的好习惯是二级登录系统。您可以在亚马逊等网站上看到这一点,您可以在其中将商品添加到购物车而无需登录,但如果您想以某种方式结帐或编辑您的帐户,则必须再次输入密码。

其他提示

对于敏感信息(即身份验证结果),仅使用会话。会话存储在服务器端,并且不太可能受到损害。

关于会话生命周期,默认是浏览器会话的生命周期 - 但您可以控制它。有几个设置会影响它:

session.gc_maxlifetime - 有效控制会话的生命周期。

session.gc_probability 和 session.gc_divisor 一起确定会话垃圾收集发生的频率。

最后 - session.cookie_lifetime 控制会话 cookie 的生命周期(保存会话 id 的 cookie,因此不必通过 URL 传输)。它应该与 session.gc_maxlifetime 的值匹配。

另外,切勿将密码存储在会话或 cookie 中(即使是散列格式)。只是认证的结果。

将 ID 存储在 $_SESSION 中,但不存储散列或非​​散列密码。一旦用户登录并且 ID 保存在 $_SESSION 中,您就不再需要密码了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top