用于持久登录的db方案

时间:2012-09-26 11:15:03

标签: php

我想将cookie的密钥与数据库中的密钥进行比较,以便让返回的访问者自动登录该站点,这意味着db和cookie中的密钥将与特定用户相关联

我的问题是什么更好,将密钥存储到存储用户名的表中 使用他们的密码,或创建一个单独的表,当然会有用户名和相关的密钥和时间戳。

复杂性在这里是一个问题 - 此外我试图找到一个if innodb或Isam更适合上述。

使问题复杂化的是,从现在开始难以投射的事实 应用程序的大小以及它可能如何影响数据库的设计。 我越早找到一个更好的解决方案

1 个答案:

答案 0 :(得分:2)

我将就如何处理这个问题提出一些想法和想法。

现在,在执行此操作时应首先考虑的是其他网站如何执行此操作:

  • 亚马逊允许您在持久性cookie下浏览网站,但是他们不允许下订单或更改详细信息而不必再次强制登录。然而据说这仍然存在严重的安全漏洞。如果您允许一次单击订购,然后其他人使用您的计算机并点击来自亚马逊(例如广告)的广告系列电子邮件中的链接,则仍有可能将该订单放置在其他人帐户上而无需实际登录(是的,我偶然发现了这个,谢天谢地)。
  • Facebook采用与亚马逊相似的方法。根据个人经验,我认为他们每两天要求重新编辑一次,以编辑帐户详细信息等。
  • 我可以收集的Stackoverflow没有这样的安全措施。登录后,您将登录指定的持续时间。
  • Google提供2年以上的Cookie,每周大约一次,要求您重新登录以验证自己。

因此,您可以看到许多网站不仅允许持久登录来控制其用户交互,实际上返回的持久登录甚至很少会完全记录一个人。相反,大多数网站实施的是2层登录系统,您可以将其视为cookie用户,但无需再次登录就无法编辑任何内容。

你会立刻注意到这里的事情。许多这些网站仅在浏览器会话到期时不关心cookie过期。持久性cookie很少有短期到期,所以这一点是没用的。正如@pyruva所说,很容易窃取某人的cookie并查看网站,这种情况一直发生在Facebook上(你甚至可以找到关于如何做的视频教程)。

所以首先要记住的是,持久登录本质上是不安全的。通过实现诸如2层认证系统之类的东西,使其安全的方式通常在您的应用程序逻辑中。

您永远不应该做的一件事是在该cookie中存储一些有关用户的个人身份信息,例如用户名或密码,即使是以散列形式。更好的方法是使用随机生成的令牌(在此考虑OAuth2)最初与服务器握手。

当然,您需要考虑的另一件事是保护您的Cookie。您可以在Google上找到关于此的大量资源,但这里有一个应该有用的链接:http://www.codinghorror.com/blog/2008/08/protecting-your-cookies-httponly.html

所以希望这应该给你一些方向和暗示如何解决这个问题。

修改

每个访问您网站的用户在Cookie方面实际上都有两个会话。他们有一个浏览器会话,当浏览器关闭时,它将从浏览器中删除cookie(通常在HTTP头中表示为0到期时间)。

然后是持久会话。您现在要实施的那个,其中cookie可以在它们实际到期之前持续数年。

这就是我对浏览器过期的意思。因此,大多数网站都会存放临时cookie,一旦您关闭浏览器就会删除它们。这些cookie通常用于保存您的会话。

如果网站关注Cookie过期,那么他们就不会在您的计算机上存放有效期为2年的Cookie。如果有人要使用过期的cookie来滥用你的帐户,我们就要面对它们,因为cookie仍然完全有效,所以它们运气不好。这是一个更大的安全威胁,但它确实证明了我的观点。