【问题标题】:Apache cross site cookie sharing issueApache 跨站 cookie 共享问题
【发布时间】:2023-03-25 13:12:01
【问题描述】:

我正在尝试做一些不寻常的事情。我有一个要从文件系统打开的 html 文档 (file:///usr/local/var/www/myFile.html)

在这个文件中,我通过 php 从本地服务器加载脚本库:

<script src="http://localhost/myscript.php" type="text/javascript">

这确实有效 - 这不是我的问题。我的问题是会话/cookies

首先,我使用 localhost/login.php 登录

当我通过http://myFile.htmlmyscript.php 打开 myFile 时,我在 login.php 中设置了会话和 cookie 变量。当我从文件系统打开 html 文件,然后通过 php 从服务器获取我的脚本时,它没有我的会话或 cookie 变量。 Chrome(客户端)在问题下标记会话和 cookie:

指示是否在跨站请求中通过以下方式发送cookie 指定其 SameSite 属性 因为 cookie 的 SameSite 属性未设置或无效,所以它默认为 SameSite=Lax,这会阻止 cookie 在跨站点请求中发送。这种行为可以保护用户数据不被意外泄露给第三方和跨站点请求伪造。通过更新 cookie 的属性来解决此问题:如果 cookie 应在跨站点请求中发送,请指定 SameSite=None 和 Secure。这允许第三方使用。如果不应在跨站点请求中发送 cookie,请指定 SameSite=Strict 或 SameSite=Lax。 3 个饼干

列出的其中一个 cookie 实际上是 PHP 会话 ID。另外两个是我在登录时设置的 cookie,作为没有会话变量的解决方法。

所以我去编辑了我的 php.ini 文件(我在另一个 php 页面上使用了 phpinfo() 以确保它是正确的 php.ini)

我做了这些改变

session.cookie_secure = 1
session.cookie_samesite = "None"

我重新启动了 httpd,但我仍然在 Chrome 中收到错误消息,并且会话和 cookie 未设置在我在 .php 文件中查找它们的位置

我做错了什么/我在 php.ini 中缺少什么?

--- 编辑---

我在 Safari 中尝试了上述方法,并且成功了。看来问题只出在 Chrome 上

【问题讨论】:

  • 为什么不一直使用http://localhost(而不是file 协议)?为什么其他非 PHP 渲染的部分需要使用 PHP 的 session cookie?
  • @NicoHaase 好问题。原因是在我的情况下,我正在使用我的 HTML 文件,就像使用单词 (.doc) 文件一样:从 FS 位置编辑它
  • 这是什么意思?这与 cookie 有什么关系?
  • @NicoHaase 我正在通过localhost/login.php 登录。我在 login.php 中设置的会话密钥和 cookie 正在匹配 - Chrome(客户端)是我看到消息“指示是否发送 cookie...”的地方。我尝试按照此 Chrome 问题中的说明进行操作,但这并没有解决 - 我仍然无法访问会话或 php 中的 cookie
  • 在我(已删除)的回答之后,我仍然看不到您指的是什么:http://myfile.html/(在您的问题中)意味着您有一个名为的 host myfile.html,充其量是令人恼火的。但更可能不是你想要的。在 http:// 之后,您需要拥有服务器名称。另外,请注意 Cookie 是 http 协议中的一个概念,在 file:// 协议中没有等价物。最后,浏览器通常会保护您的本地环境 (file://) 免受从 Web (http://) 加载的任何内容,所以我期望这两个协议指的是严格分离的内容.

标签: php apache google-chrome httpd.conf


【解决方案1】:

我认为那些回答的人没有理解我的问题,我可能对他们的误解有过错。

无论如何,我再次从 Chrome 中读取消息时发现,我还必须在我的 cookie 上设置相同的站点值。这是我在 login.php 中的做法:

    $res = $stmt->fetch(PDO::FETCH_ASSOC);
    $success = true;
    $_SESSION["editor"] = $_REQUEST["userID"];
    $_SESSION["agency"] = $res["id"];
//    setcookie("editor", $_POST["userID"], time() + 60 * 60 * 24, "/"); // 86400 = 1 day
//    setcookie("agency", $res["id"], time() + 60 * 60 * 24, "/"); // 86400 = 1 day
    setcookie("editor", $_POST["userID"], [
       "expires" => time() + 60 * 60 * 24,
       "path" => "/",
       "domain" => "", 
       "secure" => true,
       "httponly" => false,
       "samesite" => 'None'
      ]);

    setcookie("agency", $res["id"], [
       "expires" => time() + 60 * 60 * 24,
       "path" => "/",
       "domain" => "", 
       "secure" => true,
       "httponly" => false,
       "samesite" => 'None'
      ]);

在这里,我直接在我正在创建的 cookie 上设置“samesite”属性。现在 cookie 信息在 chrome 中的 http://localhost/myscript.php 中可用

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 2020-06-02
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 2013-04-22
    • 2013-02-13
    相关资源
    最近更新 更多