使用 Cookie 和 Salted 哈希的 PHP 登录系统

2022-08-30 22:23:01

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

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

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

所以,这是我的问题:

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

请注意,在此特定问题中未考虑任何数据库安全问题。

关于数字3,我的意思到底是:

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

我想保持我的网站尽可能安全,高效和用户友好。如果采用基于SessionID的方法,我也希望得到一些关于如何将其存储在数据库中的解释。

提前感谢您

编辑:Eran和Brian的答案结合起来似乎是我需要的。不幸的是,我只能将其中一个标记为已接受。我将尝试继续实现,看看哪一个更有用。


答案 1

我想重申Eran的观点,永远不要在会话或cookie数据中存储用户密码甚至密码的哈希值。

总的来说,我已经使用Cookie在Web应用程序中实现了“记住我”功能。有关构建“安全”持久登录系统的信息的一个很好的起点是这篇关于鱼缸的博客文章另一个 Stack Overflow 答案中已经介绍了深入的答案。

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

另一个要遵循的良好做法是2级登录系统。您可以在亚马逊等网站上看到这一点,您可以在不登录的情况下将内容添加到购物车中,但是如果您想以某种方式结帐或编辑您的帐户,则必须再次输入密码。


答案 2

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

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

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

session.gc_probability和session.gc_divisor共同决定了会话垃圾回收发生的频率。

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

此外,切勿将密码存储在会话或Cookie中(即使以散列格式)。只是身份验证的结果。


推荐