【问题标题】:Different Session Cookie for Different Paths不同路径的不同会话 Cookie
【发布时间】:2014-01-04 00:42:14
【问题描述】:

我需要为我网站上的各个目录存储单独的 cookie。我已经阅读了几篇关于如何实现这一点的文章,但我无法获得任何适合我的解决方案。我在每一页上执行这些行之一(COOKIE_PATH = '/city_dir/'):

session_set_cookie_params($lifetimeSeconds, COOKIE_PATH);

session_save_path(COOKIE_PATH);

接着是:

if (isset($_COOKIE['PHPSESSID'])){ 
    $data = $_COOKIE['PHPSESSID']; 
    $timeout = time() + $lifetimeSeconds; 
    session_start();
    setcookie('PHPSESSID', $data,  $timeout); 
}
else {
    session_start();
}
session_regenerate_id(true);

第一行 (session_set_cookie_params) 听起来像是正确的解决方案,但是当我使用该行时,Chrome 网络开发人员工具列表中根本没有显示任何 cookie,并且我无法登录该站点。

第二行听起来不像是正确的解决方案(似乎我应该处理 cookie 路径,而不是保存路径),但它更接近了。第一次加载页面时,我看到路径“/”的 cookie。如果我刷新页面,该 cookie 仍然存在,并且为路径 COOKIE_PATH 列出了一个 cookie。不幸的是,我仍然无法登录。整个周末我搜索并尝试了许多变体,但无法正常工作。我错过了什么?我正在使用 PHP 版本 5.3.18。

【问题讨论】:

  • session_save_path()与cookies无关;它设置存储东西的服务器目录。其实在session_set_cookie_params()之后我也看不懂你的代码的相关性。问题很可能是:1)COOKIE_PATH 包含无效路径(您没有说清楚,但建议您省略前导斜杠)2)您还在站点根目录中使用会话
  • session_set_cookie_params 应该可以工作。我有一个工作实现,完全符合您的描述。仔细检查你的假设。会话开始了吗?您是否看到正在服务器上创建会话?你有会话 cookie 吗?
  • 如果您有父路径的会话 cookie,有时浏览器会显示奇怪的行为;他们会发送错误的cookie。清除您的 cookie 以确保您没有遇到此问题。
  • @Frits van Campen session_set_cookie_params 现在正在工作,但只有在我添加 session_name($cookieName) 之后才能调用它。谢谢指点。

标签: php cookies session-storage


【解决方案1】:

我需要为我网站上的各个目录存储单独的 cookie

你真的真的确定这是解决问题的唯一方法吗?如果有人将您的家人作为人质,您甚至应该尝试这样做。

如果您所爱之人的生命受到威胁,请为不同的会话使用不同的会话名称。您仍然可以将生成的 cookie 与不同的路径相关联 - 但这是巧合。

您在问题中混淆了 cookie 路径和会话处理程序路径。

您的代码将绑定现有会话(您不知道它来自哪里 - 在大多数情况下,它是浏览器已经在的路径)并重新绑定现有会话。有可能这实际上是您想要的 - 但仍然非常危险。假设您了解并管理固定风险,那么使用不同的会话名称仍然是更好的解决方案。

也许如果您告诉我们为什么您需要这样做,我们或许能够就如何解决问题提出更明智的建议。

【讨论】:

  • 使用此应用程序,一个人可以同时与多个城市(每个城市需要自己的一组会话数据)一起工作。他们在多个选项卡中的每个选项卡中打开一个城市,并在整个工作日管理每个城市的详细信息。如果还不清楚,请告诉我。
  • 我知道一个有效的用例,但你的看起来不像。以不同的方式将城市添加到请求中,例如 request-url。这也让用户很清楚他在哪个城市工作。
  • @Frits van Campen:让我相信每个城市都需要一个单独的会话的一个要求是,我的客户现在想要跟踪每个用户何时登录和离开每个城市。此外,同一用户在不同城市可能拥有不同的权限。
【解决方案2】:

session_save_path() 用于定义在服务器上存储 cookie 的位置,我不确定这是否是您所需要的。

setcookie() 的文档列出了另一个 path 参数,如果您的“路径”确实是用于访问脚本的端口之后的 URL 部分,这可能很有用。

我不会使用PHPSESSID,因为它用于跟踪用户会话,并且在同一主机上具有不同会话是很不寻常的。

【讨论】:

    【解决方案3】:

    您似乎使这变得比必须的更困难。网站可以在客户端的浏览器中设置许多 cookie,但它们不遵循目录结构。

    你想做的是这样的:

    setcookie('Akron',$data_about_akron,time() + (86400 * 7)); // 86400 = 1 day
    setcookie('Boston',$data_about_boston,time() + (86400 * 7)); // 86400 = 1 day
    

    然后使用以下命令检索它:

    $data_about_akron = $_COOKIE['Akron'];
    

    【讨论】:

    • @FritsvanCampen 在你跺着脚对每个人的答案投反对票之前阅读了这个问题。他滥用会话变量来尝试设置不同的 cookie。他的第一句话是:“我需要为我网站上的各个目录存储单独的 cookie。”但是我同意使用 PHPSESSID cookie 是不好的......
    • 我认为这可以解释(毕竟会话使用 cookie)。因为他在谈论登录,所以他可能想要一个会话,因为 cookie 不安全。你的回答还有其他问题。 setcookie 确实有一个 $path 参数。在发布答案之前,我会要求澄清 $data_about_akron 中的内容。
    • @Digital Chris 我需要单独的 cookie 来存储每个用户登录每个城市的会话 ID。此外,目录结构的相关性在于,当用户位于特定城市的目录中时,我想使用与该城市相对应的 cookie(即会话 ID)(例如,在 site.com/akron 上时,获取 cookie命名为“akron”——如果我将 url 更改为 site.com/boston,他们将需要登录 boston,此时将创建一个新的“boston”会话和 cookie,其中包括他们对 boston 的权限。
    【解决方案4】:

    添加会话名称为我提供了我正在寻找的功能(经过轻微测试):

    session_name($cookieName);
    session_set_cookie_params($lifetimeSeconds, $cookiePath);
    

    使用此代码,没有 PHPSESSID cookie,只有命名的 cookie。

    还提出了这是否是适当的方法的问题,并且该问题仍然悬而未决。在阅读了会话固定之后,听起来风险在于我在 cookie 设置之后包含的代码。该代码实际上是为了解决一个不同的问题,我只是将其包含在内,因为我认为它可能会对原始问题中提出的 cookie/会话问题产生影响。

    @Frits van Campen:让我相信我需要为每个城市单独会话的一个要求是,我的客户现在想要跟踪每个用户何时登录和离开每个城市。此外,同一用户在不同城市可能拥有不同的权限。

    那么,如果这是一种不好的方法,为什么它不好(安全性、可维护性等)?还有什么其他选择(我只能想办法转移到子域)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-25
      • 2010-10-31
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 2010-10-01
      相关资源
      最近更新 更多