“记住我”功能中的Cookie和会话

时间:2010-02-04 15:12:33

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

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

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

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

4 个答案:

答案 0 :(得分:4)

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

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

这会自动发生。

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

如果您存储的数据量少于4KB,我强烈建议您先在cookie中设置该数据。我通常存储用户ID,用户名和其他几个属性。请记住,检查cookie值是微不足道的,因此在进入客户端之前应对此信息进行加密。

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

答案 1 :(得分:2)

  

总是让我感到困惑的是,即使我没有明确设置cookie,我也会把它放在我的浏览器中。

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

绝大多数会话库都是通过设置cookie来实现的。

  

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

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

答案 2 :(得分:0)

解释Cookie和Session之间的关系:

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

因此,cookie存储了识别哪个用户使用哪个会话所需的会话标识符。这也是Session Hijacking的发生方式,当人们可以更改会话识别cookie以使用其他人的会话标识符时。

答案 3 :(得分:0)

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

  

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

用户关闭浏览器后会立即终止会话并删除co​​okie。我不相信有任何机制可以保持会话值,并且有充分的理由。