【问题标题】:Accessing session data with a session ID使用会话 ID 访问会话数据
【发布时间】:2011-03-27 02:36:39
【问题描述】:

有人告诉我,将密码、用户名和用户 ID 等内容存储在 cookie 中是不安全的,相反,您应该将 sessionID 存储在 cookie 中。这就是我迷路的地方。

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

感谢所有帮助。

【问题讨论】:

    标签: php security cookies session


    【解决方案1】:

    可能最好的方法是创建一个包含以下字段的“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_id 和用户进行哈希处理的不同方法。

    【讨论】:

    • 谢谢!几个问题: sessionID 是否与 cookie (md5($username.ip);) 中存储的相同? // 根据您的示例,IP 地址似乎用于身份验证,因此如果他们的 IP 地址更改(代理),他们将不得不再次登录,对吗? (不是问题,只是好奇。) // 另外,last_logged_in 字段的具体用途是什么? (再次,只是好奇?)
    • IP 地址是唯一的哈希值。用户更有可能意识到您只是在散列用户名。然后他们可以破解 cookie 并以任何人的身份登录。如果是 md5($username.$ip) 则更难计算出散列是什么。 IP 是否更改无关紧要,因为它作为 md5 哈希存储在 cookie 中。因此,您只需检查数据库中是否存在 session_id = 'md5($username.$id)' 的会话。如果不创建它。如果它确实使用新的 IP 地址和哈希进行了更新。存储上次登录时间和 ip 只是为了安全。如果未经授权的访问你可以检查。
    • 好的,所以 IP 地址有点像盐,除了它对每个用户都是唯一的。并且每次他们使用有效的 session_id 登录时,我都会使用新的 session_ID 进行更新,出于安全目的,我假设。听起来不错!感谢您的帮助!
    • 我还有一个问题,一旦我成功验证了用户,使用内置的 $_SESSION 变量来存储用户ID 是安全的,对吧?
    • 是的,应该没问题,前提是您没有在其中存储任何敏感数据(密码、信用卡号等)。这个站点:articles.sitepoint.com/article/php-security-blunders,有一个关于 $_SESSION 的小总结和一些注意事项。
    【解决方案2】:

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

    对于“记住我”功能,您可以发送包含用户 ID 和该用户哈希密码哈希的 cookie,该哈希密码再次使用一些已知但秘密的令牌进行哈希处理。但是,该解决方案不允许您在不重置某人密码的情况下远程使某人的登录名失效。

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

    【讨论】:

    • 但是使用令牌会不会像存储密码或用户 ID 一样容易受到攻击?
    • 关于您回复的第一部分,我考虑过使用模板,但我不这样做是有原因的。主要是,我喜欢自己做,我喜欢学习如何去做。在我看来,除非我自己做,否则我不会学会如何去做。 (我自己做的意思是学习如何在网络上做,或者从 SO 的优秀人员那里学习)
    • “使用令牌不会像存储密码那样容易受到攻击” - 在某种程度上是的,但是对于持久登录来说这是一个必要的邪恶,你实际上是在为客户端提供一种替代方法无需密码即可登录。好处是用户的密码本身不会被泄露,只是一个只能在这个站点使用的令牌,当他们启动任何高风险活动(例如更新他们的电子邮件或密码)时,您仍然需要验证用户的密码等。您还可以选择在特定时间后使令牌无效,而无需更改密码等。
    • 如果您想自己了解这一切是如何运作的,这对您有好处;)如果您有时间并愿意这样做的话,这就是我在书中自己做某事的充分理由。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 2015-04-26
    • 2015-11-17
    相关资源
    最近更新 更多