2009-12-07 34 views
12

我的网站有一个登录系统,存储在数据库中的用户的详细信息是userid(对每个用户都是唯一的, (唯一),显示名称(不唯一),密码membersince
现在我应该在cookie中存储什么?我正在考虑只在cookie中存储用户标识和过期日期,然后如果用户在注册后检查cookie并将他登录(这种方式看起来不正确),并重新销毁cookie如果他决定退出。
*一点解释也会非常有帮助。由于我应该在cookie中存储什么以在用户登录时实现“记住我”

+0

好像你已经回答这个问题你自己,存储userid。 – TechTravelThink 2009-12-07 07:47:39

+1

这不安全 - 请参阅下面的答案。 – Jon 2010-09-28 13:11:05

回答

12

如果您使用只有您的应用程序知道的密钥对其进行签名,则只能将该用户标识存储在cookie中。否则,用户可以将Cookie更改为任何内容并以其他人身份登录。因此,如果您想存储用户标识,则还需要使用密钥存储用户标识的散列(理想情况下使用HMAC),并且当您要将它们登录时,计算相同的散列并将其与来自Cookie的散列进行比较。另一种解决方案是生成一个随机令牌,将其存储在数据库中并在cookie中使用。如果它足够长且随机,那么有人很难猜出另一个人的令牌。

+0

谢谢很多人 – halocursed 2009-12-07 08:11:05

+0

谢谢!但是,你的意思是“用户名和密钥”。如果我是一个坏人,并且将整个cookie加以压缩,并获得这个散列字符串来假装我是用户登录的,服务器是否可以知道我是错误的人? – Jaskey 2014-11-19 11:09:47

+0

秘密密钥的要点是确保你不能像任何你想要的用户那样通过设置cookie来“登录”。在不知道密钥的情况下,您无法构建cookie。如果您为现有用户加注整个cookie,则当然可以以该用户身份登录。有几种方法可以防止这种情况的发生:1)使cookie在一段时间后过期(将时间戳编码到cookie中),2)使Cookie特定于某个IP地址(再次,在cookie中编码IP地址),3)使它特定于某个用户代理字符串(这可以很容易伪造) – 2014-11-19 18:39:34

1

PHP内置的会话管理,做你正在寻找什么:

http://us.php.net/manual/en/book.session.php

我不会推荐存储在cookie中的USER_ID。相反,您可以生成唯一的令牌并将该令牌与数据库中的用户相关联,然后检查每个请求上的令牌重新生成令牌。同样,这有点多余,因为会话管理已经内置到PHP中。

+0

你能否给出一点解释。 – halocursed 2009-12-07 07:48:08

-2

只需将cookie过期时间添加到2天或想要记住用户的天数并保存该cookie即可。

相关问题