3

我正在尝试使用 cookie 实现“记住我”系统,该系统将跨浏览器记住用户,这意味着如果用户使用浏览器 A 登录网站并选中“记住我”,然后使用“记住我”登录到浏览器 B ,无论他使用哪种浏览器,他都会继续自动登录。(在浏览器 B 中选中“记住我”不会破坏他在浏览器 A 中的持久登录)。

为此,我设置了我的数据库,以便可以将多个密钥与用户 ID 一起存储。当用户登录我的网站时,会检查 cookie 的值。如果在数据库中找到该值,则为用户分配一个新的 cookie,并且更新数据库中的该 cookie 键条目以匹配。其他键保持不变,不影响其他浏览器的登录持久性。当用户手动注销时,检查cookie,删除数据库中的相应条目,然后删除cookie。

当用户手动删除他的 cookie 时,问题就出现了。如果用户这样做,我将无法删除数据库中的相应条目。它只会成为我数据库中的永久条目。当我不尝试支持跨浏览器“记住我”时,这不是问题,但通过允许存储多个 cookie 密钥已成为问题。

有什么办法可以解决/避免这种情况吗?

有大量关于持久登录的信息,但似乎从未涵盖跨浏览器的持久登录,因此任何帮助都会很棒。(也可以随意批评我的方法和任何安全问题。当我只允许每个用户“记住我”时,它似乎更安全,但跨浏览器的持久登录似乎是用户想要的功能)。

我正在使用 MySQL 和 PHP。

4

4 回答 4

2

我建议使用“记住我(足够长)”的解决方案。在会话上设置一个到期时间,但让它变得很长。根据您期望用户登录的频率,这可能需要 8 小时到一周甚至一年以上的时间。每次他们使用有效的 cookie 访问时,您都会在幕后更新过期时间,并且它看起来是持久的。如果他们删除 cookie,那么最终他们的会话将被删除。

(如果您实际上并没有使用会话,听起来不像,您需要围绕此添加一些维护编码。可能最好了解会话而不是重新发明轮子。)

于 2012-05-02T06:46:04.390 回答
2

我同意@llion 的建议,即在 cookie 上设置过期时间,在这种情况下,您可以安排一个流程从 dB 中清除过期的 cookie。但是,您可以通过在您看到 cookie 时延长它们的寿命,使用户觉得这几乎就像 cookie 是无限期持久的。

为了其他对此问题感兴趣的读者的利益,我真的希望您只将 cookie 的哈希值存储在您的 dB 中。

于 2012-05-02T06:53:13.947 回答
2

要清楚地回答您的问题:

无法在野外知道流氓 remember_me 令牌,唯一真正的解决方案是让您的 remember_me 令牌仅持续几周,然后cron-job 或守护进程将它们杀死

这解决了您的数据库过度拥挤问题,这似乎是您请求的用例。

请注意您正面临一个现实问题,您无法猜测用户何时删除了 cookie,没有从浏览器或其他方法触发反向进程,因此唯一的方法是如果没有,则定期杀死它们used,并刷新一次使用的到期日期。

你描述你的系统的方式更安全,(如果做得对的话)长期存在的 php 会话,所以我建议你保持你当前的方法,用系列+令牌保护它,并杀死几个星期未使用的 long_live 令牌。

希望对您有所帮助。

于 2012-05-02T21:26:11.893 回答
0

嗯,如果他在另一台机器上并使用浏览器,同样的登录会发生什么?这肯定会发生。在我们家,我一直这样做。我在楼下有 3 个盒子,我妈妈在楼上有 2 台机器。

也许您可以使用微时间和来自 navigatior.userAgent 的 UA 字符串来保证会话是唯一的

但你不能得到计算机名。但是您可以通过 JS api 获取他们的 IP 地址。http://www.w3.org/TR/2010/WD-system-info-api-20100202/#network 但使用它可能会在浏览器中触发某种警告对话框。不。不起作用。

java可以获取ip。

于 2012-05-02T11:00:13.900 回答