使用Cookie和Salted Hashes的PHP登录系统

时间:2008-12-31 00:59:35

标签: php session login cookies

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

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

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

所以,这是我的问题:

  1. 我应该使用$_SESSION还是$_COOKIE?这些方法的主要优点是什么?
  2. 如何实施“记住我”复选框?
  3. 哪些信息应存储在session / cookie变量中?
  4. 请注意,在这个特定问题中没有考虑数据库安全问题。

    关于3号,我的意思是:

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

    我希望我的网站尽可能安全,高效且用户友好。 如果采用基于SessionID的方法,我也会对如何将其存储在数据库中的一些解释表示赞赏。

    提前谢谢

    编辑:Eran和Brian的答案似乎是我所需要的。不幸的是,我只能将其中一个标记为已接受。我会尝试继续实施以确定哪一个更有用。

3 个答案:

答案 0 :(得分:9)

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

总的来说,我已经使用Cookie在网络应用中实现了记住我的功能。有关构建“安全”持久登录系统的信息的好地方是blog post on the fishbowlanother Stack Overflow answer已经涵盖了一个深入的答案。

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

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

答案 1 :(得分:8)

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

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

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

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

最后 - session.cookie_lifetime控制会话cookie的生命周期(包含会话ID的cookie,因此不必通过URL进行转换)。它应该与session.gc_maxlifetime的值匹配。

此外,永远不要在会话或cookie中存储密码(即使是散列格式)。只是验证的结果。

答案 2 :(得分:0)

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