我想在浏览器cookie中保存用户的身份验证信息以进行持久登录。正如他们所说,它永远不会安全地在cookie中存储任何秘密信息(例如密码),但是为了拥有诸如“记住密码”之类的选项,我认为没有任何其他选择。
因此,如果用户想要记住他的登录信息,并且我存储用户名(电子邮件)+不是密码,而是存储其他一些独特信息,例如cookie中的HASHED DB ID。然后我应检查存储在cookie中的散列ID是否与存储在Cookie中的用户电子邮件匹配。 我认为任何人都可以很容易地看到存储在浏览器中的cookie(例如在Firefox中,选项 - > Cookies)。
那么这对于某人从其保存的计算机中读取cookie一样弱,然后在其他计算机上设置带有该信息的cookie并且他将登录? (因为脚本将检查存储的电子邮件并使用数据库散列id并且它将匹配)?
如果不在数据库中存储其他信息(例如会话ID等),这种方法是否可以改进? 感谢
答案 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)
我认为没有其他选择
再想一想。
您无需存储密码客户端以维护会话。 “记住我”操作是一样的 - 使用随机值,它是服务器上保存数据的查找键。
如果不使用带有密码短语的客户端证书,那么您所做的任何其他事情都会使事情变得复杂,并且更有可能暴露客户的私人数据。