PHP会话干扰子域会话

时间:2017-11-21 17:01:27

标签: php

我在同一台服务器上有几个网站,其中包含以下域名,其中PHP会话域设置为' .example.com'所以cookie在两个网站之间共享:

  • example.com
  • shop.example.com

我还有一个单独的服务器,其中包含以下域admin.example.com,并希望它使用自己的会话/ cookie。但是当有.example.com Cookie时,admin.example.com网站会尝试使用该值代替其.admin.example.com Cookie值,从而导致会话问题......

如果我要删除.example.com Cookie,则网站会使用正确的.admin.earlowen.com值按预期工作。

我已将session.cookie_domain设为.admin.example.com无效。我错过了什么吗?或者是不可能的。

1 个答案:

答案 0 :(得分:1)

由于它们共享同一个域,因此它们是同一个站点并共享会话。

您可以使用管理部分中的session_name手动覆盖此内容。

这样的事情:

<?php
//this forces the admin page to recognize a different cookie as it's session id
session_name('PHPADMINSESSID');

//start the session normally
session_start();

还有一些其他棘手的方法可以做到这一点,但你通常应该避免使用棘手的,因为你很容易忘记你做了什么而后来无法弄明白。我会解释其中的一些作为参考:

  • 如果可以使用双子域,则会更改预期的主机名,并且会导致两个不同的固有会话。例如,subdomain.example.comexample.com将共享会话,但subdomain.username.example.comexample.com将不会,并将使用单独的会话。你应该避免这种情况,因为如果你决定实施一些后端逻辑来管理会话并期望它们被共享,那么这将很难解决。

  • 您还可以使用session_id强制执行不同的会话,但这需要您手动跟踪ID并且会非常复杂,并且还需要您设置某种数据存储以跟踪哪些会话会进行什么,这会增加很多不必要的开销。

最简单的方法是为每个会话使用不同的session_name值。