【问题标题】:PHP Session Not Restoring from CookiesPHP 会话未从 Cookie 恢复
【发布时间】:2019-02-06 18:06:07
【问题描述】:

当用户返回我的网站时,它会尝试从 $_COOKIE 关联数组恢复他们的最后一个会话。它没有按预期工作。我可以在浏览器的 cookie 管理器中查看 cookie 是否存在,但它们似乎没有保存到 $_SESSION 关联数组中。

这实质上是用户返回我的网站时的程序流程:

foreach ( $_COOKIE as $name => $val )
{
  $_SESSION[$name] = $val;
}

session_start();

...

$some_var = $_SESSION[$var_name];

我是否有问题,或者我不应该覆盖PHPSESSID?任何关于我做错了什么的见解将不胜感激。谢谢。

【问题讨论】:

  • 你完全错了。您需要做的唯一 事情就是调用session_start() - 忘记$_COOKIEs,PHP 会为您完成所有这些。
  • 那么,我手动保存 cookie (setcookie),session_start 会自动将它们保存回 $_SESSION 关联数组?
  • 您不需要setcookie() - 调用session_start() 会自动为您设置cookie。

标签: php session cookies session-cookies


【解决方案1】:

您将会话和 cookie 混淆了。您不需要将东西放入$_COOKIE 数组中。只需使用session_start(),然后将内容放入$_SESSION。 PHP 将自动为您管理会话/cookie。

$_COOKIE 变量存储在用户浏览器中,因此它们不安全并且可以被用户操纵 => 安全风险。

$_SESSION 变量仅存储在服务器上。 cookie 中存储的唯一内容是 session_id,因此无法操纵 $_SESSION 变量。

这有意义吗?

【讨论】:

  • 我了解 $_COOKIE 和 $_SESSION 之间的区别。当用户返回站点时,PHP 如何知道恢复会话数据?假设他在某个时候登录了我的网站,关闭了他的计算机,并在第二天返回该网站。它怎么知道恢复他的登录信息,让他不用重新登录?
  • 我认为如果您使用session_set_cookie_params() 指定生命周期,那么您可以指定会话将持续多长时间。默认情况下,直到浏览器关闭。此外,如果您要存储会话一段时间,请检查 PHP 会话垃圾收集设置。即使 cookie 有效,PHP 也可能已经从服务器上清除了会话文件。
  • 我决定将此功能推迟到应用程序的更高版本。我现在接受你的回答,因为它最有意义并且获得最多的赞成票。谢谢。
【解决方案2】:

session_start() 放在其他任何内容之前;此函数初始化您将在$_SESSION 中访问的会话数据。

不完全确定您要通过其余部分实现什么,但session_start() 首先是一个起点...

【讨论】:

  • 当用户返回站点时,PHP 如何知道恢复会话数据?假设他在某个时候登录了我的网站,关闭了他的计算机,并在第二天返回该网站。它怎么知道恢复他的登录信息,让他不用重新登录?
  • @JimFell 它没有;会话用于浏览器会话,而 cookie 用于您设置的任何时间段。当然,您可以相互协调使用它们。
猜你喜欢
  • 2020-12-19
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 2012-02-10
  • 2011-06-24
相关资源
最近更新 更多