在Cookie中存储登录信息

时间:2011-06-14 07:47:08

标签: php cookies

我想在浏览器cookie中保存用户的身份验证信息以进行持久登录。正如他们所说,它永远不会安全地在cookie中存储任何秘密信息(例如密码),但是为了拥有诸如“记住密码”之类的选项,我认为没有任何其他选择。

因此,如果用户想要记住他的登录信息,并且我存储用户名(电子邮件)+不是密码,而是存储其他一些独特信息,例如cookie中的HASHED DB ID。然后我应检查存储在cookie中的散列ID是否与存储在Cookie中的用户电子邮件匹配。 我认为任何人都可以很容易地看到存储在浏览器中的cookie(例如在Firefox中,选项 - > Cookies)。

那么这对于某人从其保存的计算机中读取cookie一样弱,然后在其他计算机上设置带有该信息的cookie并且他将登录? (因为脚本将检查存储的电子邮件并使用数据库散列id并且它将匹配)?

如果不在数据库中存储其他信息(例如会话ID等),这种方法是否可以改进? 感谢

7 个答案:

答案 0 :(得分:12)

还有另一种选择。

对于每个用户,在登录并请求记住时,创建一个长随机字符串。

将此字符串与userId一起存储在您提供给用户的cookie中 在数据库中存储字符串的正确盐渍哈希。

如果用户提供了一个记住我的cookie,请将随机字符串与您在数据库中的散列验证器匹配(就像密码所在的那样)。

如果匹配 - >记录用户并为他们创建一个新的记住我的cookie 如果不匹配 - >请求用户名和密码。

答案 1 :(得分:1)

我在How to improve my user login scheme写了一个相同问题的答案 - 看看那里。

答案 2 :(得分:0)

我建议在服务器上使用唯一密钥来加密用户名(在本例中为电子邮件)并将其存储在身份验证cookie中。如果cookie被篡改,将无法解密并导致登录失败。

如果将auth cookie复制(通过手动设置cookie或XSS)到另一台计算机(或其他浏览器),则用户也将在新计算机上登录。您可以考虑添加一些有关计算机的独特信息(例如IP地址)以降低此类风险。

这是关于.NET中auth cookie的解释,但我认为这个概念也适用于php: http://support.microsoft.com/kb/910443

答案 3 :(得分:0)

在客户端存储用户信息时,你没有太多的选择......

您可以尝试使用客户端IP作为密钥进行一些加密。 这种方式即使将cookie复制到黑客计算机上,如果他没有注意到IP是加密的关键,你也会对用户的信息有一些下降保护。

Facebook正在采用这种方式做事,每当您尝试从另一个连接点登录时,就必须通过用户验证系统进行验证......

所以寻找一些可逆加密,这应该是你的一天;)

答案 4 :(得分:0)

有一篇关于如何让“记住我”饼干更安全的文章:http://jaspan.com/improved%5Fpersistent%5Flogin%5Fcookie%5Fbest%5Fpractice

我已经在PHP库中实现了本文中描述的方法:https://github.com/gbirke/rememberme,也许您可​​以将其用作参考。

会话固定和cookie窃取是Firesheep时代的一个真正问题。唯一的防御措施是使用SSL保护您的站点并监控XSS漏洞。

另一种提高安全性的方法是记住用户是否使用“记住我”cookie登录并强制他在执行“危险”操作时重新进行身份验证,例如订购或更改登录凭据。

有关更多资源,请参阅此问题:The definitive guide to form-based website authentication

答案 5 :(得分:0)

您还可以安装带有UserID的Cookie和带有过期时间戳的SessionID。 然后,如果你将cookie绑定到IP或主机名(或者最好两者),你就可以安全地使用cookie偷取者和其他东西。

答案 6 :(得分:0)

  

我认为没有其他选择

再想一想。

您无需存储密码客户端以维护会话。 “记住我”操作是一样的 - 使用随机值,它是服务器上保存数据的查找键。

如果不使用带有密码短语的客户端证书,那么您所做的任何其他事情都会使事情变得复杂,并且更有可能暴露客户的私人数据。