2011-06-14 91 views
6

我想将用户的认证信息保存在浏览器cookie中以进行持久登录。正如他们所说,它绝对不可能将任何秘密信息(如密码)存储在cookie中,但为了拥有诸如“记住密码”之类的选项,我认为没有其他选择。将登录信息存储在Cookie中

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

因此,这将是脆弱的,因为有人从其保存的计算机中读取cookie,然后在其他计算机上设置cookie并使用该信息登录? (由于脚本将检查存储的电子邮件和数据库哈希ID,它会匹配)?

这种方法能否在数据库中不存储其他信息(如会话ID等)的情况下进行改进? 谢谢

+1

一种方法是简单地存储用户的ID在cookie中,而且还具有非持续性验证的cookie。具有ID cookie但没有经过身份验证的cookie的用户可以浏览您的系统,但第一次尝试进行更改时会提示您输入密码。如果密码正确,则认证的cookie将被设置,用户不会再被询问。由于cookie是非持久性的,认证只会持续到会话结束。 – GordonM 2011-06-14 08:04:15

+0

@GordonM,谢谢,我认为amazon.com有相同的方法。我很想知道,如果您访问cookie,可以说电子邮件+和一些散列信息,那么您有多难在浏览器中设置这些cookie? – Roman 2011-06-14 08:15:28

+0

我会在cookie中存储很少的东西。持久性ID cookie将仅使用有问题的用户的ID,而非持久性认证cookie将为真或假。尽量避免在cookie中存储更多的信息,而不是完成任务所必需的信息,就好像您发送的只是一个窥探黑客必须继续使用的ID,而如果您发送其他信息可能会给黑客更多线索攻击你的系统。 – GordonM 2011-06-14 10:49:52

回答

11

还有另一种选择。

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

存储这个字符串,与用户id一起,在cookie你给用户。
在数据库中存储字符串的正确含盐散列。

如果用户呈现记得,我的cookie,匹配随机字符串,你在你的数据库有散列验证(就像它在那里密码)。

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

0

我会建议使用服务器上的唯一密钥来加密用户名(在这种情况下,电子邮件)并将其存储在auth cookie中。如果cookie被篡改,将无法解密并导致登录失败。

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

这是有关.NET中的身份验证饼干的交代,但我认为这个概念适用于PHP,以及: http://support.microsoft.com/kb/910443

0

你没有那么多的选择,当谈到对存储用户信息客户端...

你可以尝试让使用客户端IP的关键部分加密。 即使cookie被复制到黑客的计算机,如果他没有注意到该IP的加密的密钥你就会有用户信息的一些血统保护这种方式。

Facebook正在这样做的事情,证明每次试图从你必须去throught用户验证系统的另一个连接点登录...

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

+4

通过默默无闻的安全性完全没有安全性。 – Gumbo 2011-06-14 08:07:40

+1

我会记住这一个^^ – MaxouMask 2011-06-14 09:02:42

0

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

我已经实现在一个PHP库在文章中介绍的方法:https://github.com/gbirke/rememberme,也许你可以使用作为参考。

会话固定和饼干偷窃是在Firesheep时代的一个现实问题。唯一的防御措施就是通过SSL保护您的网站并监控XSS漏洞。

,以提高安全性的另一种方法是要记住,如果一个用户登录了“记住我” cookie,并迫使他时,他做了“危险”像订购或更换登录凭据重新进行身份验证。

更多的资源,看到这个问题:The definitive guide to form-based website authentication

+1

不幸的是,在第一篇链接文章中提出的改进没有任何改进。他们写的是对http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/的回应,但很遗憾他们错了。 – Jacco 2011-06-14 09:28:12

+0

你能解释为什么吗? – chiborg 2011-06-14 10:03:52

+0

评论框中没有足够的空间来详细解释。关于它的一些讨论在鱼缸文章下面,以及在[网站认证权威指南]的评论中(http://stackoverflow.com/questions/549/the-definitive-guide-to-website-authentication/ 477579#477579)。 – Jacco 2011-06-14 10:15:37

0

您还可以安装带有用户名和SessionID的cookie中有过期时间戳。 然后,如果你绑定的cookie IP或主机名(或preferrably两者)你是从饼干窃取和其他的东西相当安全的。

0

我想没有任何其他选择

再想想。

你并不需要密码客户方存储,以保持一个会话。 '记住我'的操作是一样的 - 使用一个随机值,它是服务器上保存的数据的查找键。

短期使用客户端证书与密码短语,其他任何你做的事情不会提高安全性复杂化,更容易暴露你的客户的私人数据。