【问题标题】:Cookie and session in "remember me" feature“记住我”功能中的 Cookie 和会话
【发布时间】:2011-01-13 03:07:50
【问题描述】:

我从不想让用户长时间保持登录状态,因此我从未见过“记住我”功能的用途。不过,我开始思考它是如何完成的,并希望得到一些澄清。

我目前正在将我的会话存储在数据库中。一直让我感到困惑的是,即使我没有明确设置 cookie,如何将一个 cookie 放置在我的浏览器中。我有点困惑,因为会话是会话,而 cookie 是 cookie。我看不到会话如何设置 cookie。

我还想知道,仅在会话数组中设置另一个会话变量以保持用户登录就足够了,还是我还需要设置 cookie?

【问题讨论】:

    标签: php session cookies session-cookies remember-me


    【解决方案1】:

    为了从数据库中提取会话数据,需要一个密钥。这称为会话 ID。

    会话 ID 需要存储在某个地方。作为客户端回发的 URL 字符串的一部分,或者更常见的是,作为客户端上的 cookie 的一部分。当请求发布时,会话从 cookie 中读取值并知道从会话存储中拉回哪条记录。

    这会自动发生。

    使用 session 的唯一原因是如果您要保留的数据大于 4KB(浏览器限制);或者如果从服务器中提取数据所需的时间大于从会话存储中读取数据所需的时间。

    如果您存储的数据量小于 4KB,我强烈建议您将其设置在 cookie 中。我通常存储用户 ID、用户名和其他一些属性。请记住,检查 cookie 值很简单,因此在发送到客户端之前应该对这些信息进行加密。

    另一件事是,如果从原始来源提取所需数据的查询时间很短,那么选择这样做而不是将其置于会话中。这样一来,您只有在实际需要时才获得它,而不是在每个页面加载时都获得它。

    【讨论】:

    • 谢谢。我目前正在将会话 ID 保存在数据库中。我已经验证了 cookie 中的相同会话 id 与数据库中的相同。我还需要设置一个 cookie,还是我可以在会话数组中添加另一个值并进行检查?
    • 查看我的更新。通常在登录时,我将用户 ID 存储在加密的 cookie 中,根本不使用会话。当我取回 cookie 时,我知道他们是否已登录。
    • 当我在考虑这个问题时,克里斯,让我再问你一个问题。昨天我注意到我能够更改当前浏览器上的一个 cookie。这不是安全问题吗?现在,在加密的 cookie 上,是否已经有一个功能可以做到这一点,还是我需要自己推出?
    • Residuum,这是我目前所知道的,可能是我无法理解的地方。我的数据库保存所有登录用户的会话 ID。当用户返回时,我可以检查我的会话存储是否在他们的计算机上设置了 cookie;如果已设置,则他们可以继续,否则返回登录页面。我错过了什么?
    • 顺便说一句,更改 cookie 不被视为安全问题。基本上没有办法知道你是否可以信任客户端(或你和它之间)的东西。这就是为什么您应该始终加密 cookie。
    【解决方案2】:

    一直让我感到困惑的是,即使我没有明确设置 cookie,但如何将一个 cookie 放置在我的浏览器中。

    会话处理程序必须识别哪个会话属于哪个用户。

    绝大多数会话库通过设置 cookie 来做到这一点。

    (是否)在会话数组中设置另一个会话变量以保持用户登录就足够了,还是我仍然需要设置 cookie?

    大多数会话库都设置了会话 cookie。这些是没有指定到期时间的 cookie。它们在浏览器关闭时过期,不足以实现“记住我”功能(预计在浏览器重新启动后会持续存在,因此必须有明确的过期时间)。

    【讨论】:

    • 好的,那么我需要设置一个cookie。我可以为 cookie 使用相同的会话 ID,对吗?我的意思是,会话已经保存在数据库中,我只需要评估客户端 cookie 并从那里继续。我说的对吗?
    • 让会话持续数周会造成一个非常大、非常低效的会话存储。在设计“记住我”功能时,甚至不要考虑会话。使用不同的 cookie 名称。
    • 谢谢 Dave.. 如果我使用不同的 cookie 名称,我仍然会存储 cookie id??在数据库中,对吧?
    • 话虽如此,会话仍有到期时间。在 PHP 中,这由 session.cache_expire 设置控制,默认为 180 分钟。
    【解决方案3】:

    解释Cookie和Session的关系:

    PHP 使用 Cookie 来唯一标识每个用户的会话。这是唯一更可靠的方法,因为每次您从服务器请求文件时都会发送 cookie。使用 cookie 中的令牌,也就是会话标识符,PHP 将查找 tmp 目录以查看会话是否存在。如果会话存在,则从正确的文件加载变量,您将能够访问该会话上的变量。

    因此,cookie 存储会话标识符,用于识别哪个用户使用哪个会话。这也是会话劫持的产生方式,人们可以更改会话识别 cookie 以使用另一个人的会话标识符。

    【讨论】:

    • 谢谢!所以,如果我理解正确的话,PHP 会自动为 cookie 使用相同的会话 id,对吗?
    【解决方案4】:

    底层 PHP 会话实现设置 cookie。您可以更改它并在查询字符串中传递会话 ID 值,但我不建议这样做。你不使用 cookie,PHP 会。它引用存储在 cookie 中的会话 ID 值来查找会话数据。

    我也想知道,如果简单地在会话数组中设置另一个会话变量以保持用户登录就足够了,还是我还需要设置一个 cookie?

    一旦用户关闭浏览器,会话就会被终止,cookie 也会被删除。我不相信有任何机制存在以保持会话值,并且有充分的理由。

    【讨论】:

    • 更具体地说:cookie被删除,会话超时。在服务器端,您无法检测到浏览器关闭并“破坏”了会话。
    猜你喜欢
    • 2012-12-04
    • 2015-06-20
    • 1970-01-01
    • 2013-02-20
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2018-01-20
    相关资源
    最近更新 更多