2012-08-23 73 views
0

这是一个多部分问题,所以随时给任何一个部分的输入,但因为我只能接受一个答案,我会接受最完整的答案与所有被问到的关系。如果它们相关且有用,我将赞扬部分答案。用户身份验证与“记住我”

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

1部分:

我建立了一个用户认证系统。登录有一个“记住我”功能(它还没有正常工作) - 存储用户数据的最佳方式是什么?一些想法:

  • 将用户名和sha1'd密码存储在本地存储/ cookie中。这在我看来似乎是一个不安全的选择,但我不确定。
  • 商店某种散列(也许PHP的com_create_guid()?)在localStorage的/饼干,以及在数据库中(也许随着对到期的日期?)

第2部分:

在执行“记住我”功能之后,完成它的最佳方式是什么?我是否应该让每个页面检查cookie(因为用户最初可能会打到任何页面并需要重新记录?)虽然每个页面当然需要检查会话,并且一旦它们被cookie /本地存储器重新记录,他们会得到一个常规会话,在每个页面上检查一个会话和一个cookie似乎是非常多余的(我们当然会首先检查一个会话,以便我们不会重复检查登录用户的cookie,然后在没有会话的情况下检查cookie,但仍然存在。)有更好的方法吗?

+0

你如何在你的数据库中存储密码?您应该以将它们暴露给用户(例如通过cookie)的方式存储它们,不会泄露任何信息。 –

+0

@arxanas它们使用'do_hash'作为SHA1 + CodeIgniter中的硬编码密钥存储在数据库中。 http://codeigniter.com/user_guide/helpers/security_helper.html - 这使用SHA1和自定义分配的加密密钥。我正在考虑将用户名和CI加密密码存储在cookie中(如果支持本地存储),但我不确定这是否安全? –

+0

它会的,但'SHA1'已被普遍接受为不如像'bcrypt'这样的解决方案。虽然这可能不会成为一个问题,除非你有一个庞大的客户群,你应该记住它。如果您不喜欢使用Cookie,则可以使用会话并将数据放在用户无法触及的地方。 –

回答

1

第1部分

这将是最好生成随机令牌(散列你所提到的)服务器,它都保存在数据库和饼干。随机使用可以防止他人“猜测”或生成令牌。使用GUID将是您的最佳选择。

第2部分

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

+0

因此,生成GUID比在cookie中存储用户名(纯文本)和散列密码(SHA1 +键)更安全? GUID是否保证是唯一的? 'com_create_guid()'是否正确?对不起,在一个评论中有这么多问题... –

+0

GUID绝对更安全。通常,不要在客户端存储任何密码,甚至不加密。 com_create_guid()会正常工作。还有一个PEAR UUID包,你可以考虑http://pecl.php.net/package/uuid – futuregeek

+0

所以我会将用户名和这个GUID存储在一个cookie中,以及数据库中的GUID,并且我假设应该有一个在数据库中设置的失效日期,以便GUID只在一段时间内有效,或者我应该不担心这一点?我倾向于不担心约会,但我不确定最佳做法是什么。 –