2

我正在尝试为用户编写一个简单的 HTTP 记住我的身份验证系统。

我的用户可以这样表示

{
"email" : "foo@bar.com",
"password" : "8EC41F4334C1B9615F930270A4F8BBC2F5A2FCD3" // sha1 hash of password
}

所以我的想法是我需要创建一个具有无限期(非常长)到期时间的 cookie,它将保存某种类型的信息,使我能够从数据库中获取用户,从而登录用户。

我的第一个想法是将email:password字符串简单地存储为 cookie。我认为这会很好,因为除了用户本身之外,没有其他人可以真正生成这种类型的信息,而且我可以通过简单地比较usernamepassword基于数据库中的内容来轻松检索用户。

但是后来我觉得这不是很好。它将密码摘要有效地转换为第二个密码,该密码以明文形式存储并在每个请求中通过网络传递。

所以我想也许我可以在signature每次用户登录时生成一个,这基本上是一个随机哈希,直接存储在数据库的用户对象中。

用户登录,它生成这个签名并存储,cookie 保存这个签名。每当您访问该网站时,该网站都会检查哪个用户具有该特定签名并将用户登录。注销将有效地删除 cookie,新登录将生成一个新的随机签名。

这种方法是否考虑到任何其他漏洞?

我知道,我可能应该使用已经为此制作的库,但这只是网络安全的一个简单练习。

4

2 回答 2

1

这基本上是大多数网站在您登录时所做的事情。是的,cookie 应该为用户的“会话”保存一个唯一标识符。cookie 本质上应该是随机的。是否让它在浏览器会话中持久化取决于您。

除了身份验证数据库中的 cookie,还存储条目创建时间的时间戳。超过 N 秒的 Cookie 应被视为无效(根据您的喜好设置 N)。您可以在每次使用 cookie 时重置时间戳,以便空闲会话超时。

请注意,同一个用户可能希望拥有多个会话(您是否曾经从家里和工作场所登录到您的电子邮件帐户?),所以这里的概念实际上是“会话”,而不是用户。

于 2011-06-07T15:26:18.897 回答
0

漏洞的观点都是一样的!Cookie 窃取和相关机制,但是浏览器现在已经足够智能,因此您不必担心。

第二种方法在隐私方面也很好,因为它在 cookie 中不包含电子邮件地址。它似乎更类似于存储 sessionID,在您的情况下,您正在生成随机哈希并将其存储在数据库中。

但我认为使用第一种方法会更明智;您可以在摘要中添加另一层并使用您的一些算法或私钥对其进行加密;站在更安全的一边。

于 2011-06-07T15:27:26.200 回答