【问题标题】:PHP cannot read cookies from Chrome in certain casesPHP 在某些情况下无法从 Chrome 读取 cookie
【发布时间】:2013-04-23 17:01:37
【问题描述】:

今天出现这个问题,好像和webkit有关。

在通过位置 [301/302] HTTP 标头(在这种情况下为 404 错误页面)重定向的页面上,PHP 无法读取 cookie - 这意味着 $_COOKIE 是一个空数组。

我知道在同一响应中使用 Set-Cookie 和 Location 标头会中断的 webkit 错误,但这是关于读取而不是写入,因此它应该位于请求标头中。

我使用的是最新的 Chrome v26。在后端,我的家庭服务器上有 PHP 5.3.10-1ubuntu3.6,在生产服务器上完全相同(我没有设置,也不是默认设置)。在生产服务器上,我无法像之前所说的那样读取 cookie,但在我的家庭/开发服务器上我可以。

而且情况变得更糟:在另一台运行 PHP 5.3.3-7+squeeze14 的服务器上,如果 Content-Type 标头不是 html,而是 text/plain,我也无法读取 cookie。

我通过以下方式设置 cookie:

if (setcookie($name, $value, $expire, $path, null, isset($_SERVER['HTTPS']), $httponly))
{
    $_COOKIE[$name] = $value;
    return true;
}
return false;
  • $httponly 是假的
  • $path 是'/'
  • 名称由小写字母组成
  • 值由数字和破折号组成

我可以在“开发者工具”/“资源”选项卡中看到 cookie,它在简单的 html 页面上运行良好。

感谢您的帮助。 谢谢。

【问题讨论】:

  • 快速的解决方法是不保存新的空会话。但问题仍然存在。
  • 我们能看到实际的 setcookie 调用(即所有值)吗?
  • setcookie('lwcsessid', '1367271447-42780100-18814-62545', null, '/', null, isset($_SERVER['HTTPS']), false);正如我所说,cookie 已设置并且可以在不重定向的页面上读取。我还尝试指定过期日期,而不是将其留给浏览器。

标签: php google-chrome cookies


【解决方案1】:

重定向页面和重定向页面在同一个域?也许这可以被认为是 XSS 窃取 cookie 的尝试。尝试发送“Access-Control-Allow-Origin:*”标头:

header("Access-Control-Allow-Origin: *" );

【讨论】:

  • 他们是。即使在同一个文档根目录下。我认为这是因为 Chrome 的预取功能。
  • 这可以与Do Not Track相关。尝试在浏览器中禁用它。
  • 从未启用。没有特殊的请求头,只有通常的 Accept-*、Cache-Control、Connection、Host、User-Agent、Referer 和 Cookie,重定向页面除外。
  • 您可以尝试在重定向页面强制设置cookies。使用 getallheaders() 读取 cookie,然后使用 header("Set-Cookie:") 进行设置。您可以在“位置”标题之前立即执行此操作。
  • $headers = getallheaders(); header("Set-Cookie: ".$headers["Cookie"]."; path=/");
【解决方案2】:

在我的例子中,问题在于session_set_cookie_params(),域的参数(第三个参数)以句点. 为前缀,例如“.localhost”。当我删除 . 时,填充了 $_COOKIE 变量。

【讨论】:

    猜你喜欢
    • 2018-12-05
    • 2011-12-13
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 2018-08-26
    • 2012-04-01
    相关资源
    最近更新 更多