使用cookie和会话变量持久登录

时间:2012-12-19 19:54:41

标签: php session cookies login session-variables

我一直在研究在我的网站上实施持久登录的最佳(也是最安全)方法,我想出了以下内容:

当用户登录时,会创建一个包含用户ID /用户名和随机生成的数字(令牌)的cookie。令牌与用户ID /用户名一起存储在关系表中。每次加载仅限成员的页面时,都会根据关系表检查此cookie,如果它存在与令牌匹配,则登录有效并且页面可以加载。但是,如果没有,则登录无效,cookie被销毁,并提示用户登录。

我在考虑......每次加载页面时都要保存数据库访问权限,我还可以拥有一个持续时间为10分钟的会话变量,并在浏览器关闭时自动销毁。如果会话处于活动状态,则会刷新并且用户可以继续。如果会话过期,但cookie仍然有效,请检查cookie,重置令牌,将新令牌存储在数据库中(同时删除旧令牌,或将其存储在存档表中以备将来参考),并重置cookie使用新的令牌值。

然而,会话包含什么?那个会话怎么可能不仅仅是伪造一些JavaScript?或许会话包含单向加密哈希?将用于生成该哈希(用户ID等)的内容?

我有点被困在哪里。我得到了cookie的东西,但是使用临时会话(以避免每次加载页面时重复调用数据库)都没有。有帮助吗?感谢。

2 个答案:

答案 0 :(得分:3)

根据RFC 4122声明

,建议不要使用UUID
  

不要以为UUID难以猜测;他们不应该被用作   安全能力。

我建议将所有以下信息组合并乘以哈希,并使用存储在服务器中的公钥对其进行加密。

  • UserId(或注册时为每个用户生成的用户UUID)
  • 加密他/她的密码(被视为每个用户加密的私钥)
  • 时间戳
  • 客户端操作系统
  • 客户端用户代理(浏览器名称)

对于存储令牌,您可以使用在大公司中大量使用的memcache,或者如果您专注于持久性,则使用redis

有关Cookies

的详细信息,请确保您的Cookie具有以下属性
  • HTTP Only cookie
  • 安全Cookie

答案 1 :(得分:1)

Cookie应该没问题(另一种方法是将其存储在HTTP标头中),但我不认为需要在cookie中存储用户名/ ID。令牌本身应该足够了。您可以使用UUID作为令牌。将其与用户名和last_access_timestamp一起存储在数据库表中。并且只在每个请求上发送令牌(在cookie或HTTP请求头中)。在我看来,这足以实现会议。

成功登录用户时生成令牌,存储在数据库中并传递给用户。每当用户访问该网页时,该令牌就会在请求中进行传递并进行验证。如果有效,则刷新last_acces_timestamp并且用户可以继续。验证中的查找将通过令牌完成,您可以使用用户名进行身份验证和授权。如果令牌无效或已过期,请将用户转发到登录页面。

可以使用cron作业或创建新会话定期从db中删除过期的会话。

出于性能原因,您可能会考虑将会话存储在内存中的hashmap中。由于始终更新数据库可能成本很高。

还要考虑使用HTTPS,以防止人们嗅探令牌。

几个月前,我已经通过以下方式解决了这个问题:  https://stackoverflow.com/questions/12829994/java-custom-session-implementation-expired-sessions