不同路径的不同会话Cookie

时间:2013-12-16 15:05:19

标签: php cookies session-storage

我需要在我的网站上为各个目录存储单独的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。

4 个答案:

答案 0 :(得分:1)

  

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

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

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

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

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

也许如果你告诉我们为什么你需要这个,我们或许可以就如何解决这个问题提出更明智的建议。

答案 1 :(得分:0)

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

setcookie()的文档列出了另一个path参数,如果你的"路径"在用于访问脚本的端口之后,它实际上是URL的一部分。

我不会使用PHPSESSID,因为它用于跟踪用户会话,并且在同一主机上进行不同的会话非常不寻常。

答案 2 :(得分:0)

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

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

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

还有人提出这个问题是否合适,这个问题仍未解决。在阅读了会话固定后,听起来风险与我在cookie设置后包含的代码有关。该代码实际上是为了解决另一个问题,我只是将其包括在内,因为我认为它可能会对原始问题中提出的cookie /会话问题产生影响。

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

所以,如果这是一个糟糕的方法,为什么它不好(安全性,可维护性等)?还有什么其他选择(我只能提出转移到子域名。)

答案 3 :(得分:-1)

你似乎比现在更困难。站点可以在客户端的浏览器中设置许多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'];