【问题标题】:User auth with "remember me"使用“记住我”的用户身份验证
【发布时间】:2012-08-23 13:44:52
【问题描述】:

这是一个多部分问题,因此请随时就任何部分提供意见,但由于我只能接受一个答案,我将接受与以下相关的最完整答案所有这些都被问到了。如果部分答案相关且有用,我会投票赞成。

首先,有一点背景知识,不用 TL;DR 关于这个问题:我在这个项目中使用 Quake Framework(是的,它是我的)——为了快速描述它,它使用了 CodeIgniterjQuery 1.8.0 主要是(除其他外,但它们与问题无关。)它还包括 Total Storage jQuery 插件(用于本地存储)和 jQuery Cookies 作为不支持的浏览器的后备支持本地存储。

第 1 部分:

我已经建立了一个用户认证系统。登录具有“记住我”功能(目前还没有功能)——存储用户数据的最佳方式是什么?一些想法:

  • 将用户名和 sha1'd 密码存储在本地存储/cookie 中。在我看来,这可能是一个不安全的选择,但我不确定。
  • 在 localstorage/cookie 以及数据库中存储某种哈希值(可能是 PHP 的 com_create_guid()?)(可能还有到期日期?)

第 2 部分:

实施“记住我”功能后,完成实施的最佳方式是什么?我是否应该让每个页面都检查 cookie(因为用户最初可能会点击任何页面并且需要重新记录?)虽然每个页面当然都需要检查会话,并且一旦它们被 cookie/本地存储重新记录,他们将获得一个常规会话,在每个页面上检查会话和 cookie 似乎非常多余(我们当然会首先检查会话,这样我们就不会重复检查登录用户的 cookie,如果没有会话,然后检查 cookie,但仍然存在。)有更好的方法吗?

【问题讨论】:

  • 您如何在数据库中存储密码?您应该以不会泄露任何信息的方式将它们暴露给用户(例如,通过 cookie)。
  • @arxanas 它们以 SHA1 + CodeIgniter 中使用do_hash 的硬编码密钥的形式存储在数据库中。 codeigniter.com/user_guide/helpers/security_helper.html - 这使用 SHA1 和自定义分配的加密密钥。我正在考虑将用户名和 CI 加密密码存储在 cookie 中(支持时为本地存储),但我不确定这是否安全?
  • 会的,但SHA1 已被普遍认为不如bcrypt 之类的解决方案好。虽然除非您拥有庞大的客户群,否则这可能不会成为问题,但您应该牢记这一点。如果您不想使用 cookie,您可以只使用会话并将数据放在用户无法访问的范围内。
  • @arxanas 如果用户选中“记住我”并在一周后回来,是否有办法保持持久会话?
  • 我有一个纯 JavaScript 代码,用于“记住我”的功能。想试试吗?

标签: php javascript jquery cookies local-storage


【解决方案1】:

第 1 部分

最好在服务器中生成一个随机令牌(您提到的哈希),并将其保存在数据库和cookie中。使其随机化将防止其他人“猜测”或生成您的令牌。使用 GUID 将是您的最佳选择。

第 2 部分

在每个页面中,您可以检查是否存在会话。如果没有可用的会话,请检查您的身份验证 cookie。如果 auth cookie 可用,请触发您的 auth-check 代码。这样,您只需要在用户尚未登录时检查 auth cookie。

【讨论】:

  • 那么生成 GUID 比在 cookie 中存储用户名(纯文本)和散列密码(SHA1 + 密钥)更安全? GUID 是否保证是唯一的? com_create_guid() 是正确的方法吗?很抱歉在一条评论中有这么多问题...
  • GUID 绝对更安全。作为一般规则,永远不要在客户端中存储任何密码,即使是加密的。 com_create_guid() 可以正常工作。还有一个 PEAR UUID 包可以考虑pecl.php.net/package/uuid
  • 所以我会将用户名和此 GUID 连同数据库中的 GUID 一起存储在 cookie 中,并且我假设数据库中应该设置一个到期日期,以便 GUID 仅好一段时间,还是我不应该担心?我倾向于不担心约会,但我不确定最佳做法是什么。
  • 到期部分取决于您的要求。如果您不希望用户退出,则无需存储到期时间。否则将其与 GUID 令牌一起存储在数据库中。
猜你喜欢
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 2011-06-11
  • 1970-01-01
  • 2021-08-12
相关资源
最近更新 更多