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

lui*_*bal 18 php cookies session login

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

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

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

所以,这是我的问题:

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

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

关于3号,我的意思是:

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

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

先感谢您

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

Bri*_*her 9

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

总的来说,我已经使用Cookie在Web应用程序中实现了记住我的功能.关于构建"安全"持久登录系统的信息的一个好地方是这篇关于鱼缸的博客文章.另一个Stack Overflow答案已经涵盖了一个深入的答案.

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

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


Era*_*rin 8

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

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

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

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

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

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