使用会话ID访问会话数据

时间:2010-08-09 02:51:48

标签: php security cookies session

我被告知在cookie中存储密码,用户名和用户ID之类的东西是不安全的,而是应该在cookie中存储sessionID。这就是我迷路的地方。

我的目标是拥有一个基本的“记住我”功能。通常我会将用户登录信息存储在cookie中,但由于这是不安全的,我想知道替代方案是什么。据我所知,每次创建会话时,它都会创建一个创建唯一ID的cookie,但在关闭浏览器时会过期。那么在浏览器关闭后如何访问此会话信息呢?

感谢所有帮助。

2 个答案:

答案 0 :(得分:2)

这可能是一个相当陡峭的学习曲线。您是否考虑过使用预先存在的CMS或其他解决方案来实现您想要实现的目标,甚至是可能包含此功能的框架?

对于“记住我”功能,您可以发送包含用户ID的cookie,并使用一些已知但秘密的令牌再次散列该用户的哈希密码哈希值。该解决方案不允许您远程过期某人的登录,但不会重置某人的密码。

另一种方法是为该人的登录生成一个唯一的令牌,并有另一个数据库表将该唯一令牌与特定用户和有效期相关联。

答案 1 :(得分:2)

正如所建议的以及大多数第三方应用程序所做的那样,最好的方法可能是使用以下字段创建“user_sessions”数据库表:

session_id (var_char)
user_id (int)
ip_address (var_char)
last_logged_in (unix timestamp)

然后使用cookie来存储你喜欢的md5哈希值,可能是:

md5($username.$ip); //since md5 has a lot of reverse look ups now you should use a number of fields to validate. You could use a different crypto function to make it more difficult to crack, but md5 is the simplest version available in all php versions.

编辑:然后,您将比较Cookie中存储的哈希值与数据库 session_id ,看看他们是否已经登录。在md5函数中组合几个字段的原因是创建一种不太“可猜测”的散列格式。这使得某人能够编辑cookie并以其他人身份登录的可能性降低。

这可以为所有用户完成(这样您就可以跟踪谁在线)并在cookie中设置“持久”登录变量。例如

p_login=true || p_login=false

这样你就可以知道是自动登录还是强行登录。

注意:您可以查看http://www.openwall.com/articles/PHP-Users-Passwords以获取散列密码,session_ids和用户的其他方式。