phpign会话可以在codeigniter应用程序中重叠吗?

时间:2014-08-01 22:25:00

标签: php codeigniter session

我正在尝试确定php会话是否可能重叠。我注意到一个非常奇怪的错误,我无法重现,我只是想看看会话重叠是否可能发生问题。 (只是为了排除它)

我在application / config / database.php

中有以下内容
$client_name = substr($_SERVER['HTTP_HOST'], 0, strpos($_SERVER['HTTP_HOST'], '.'));

$db['default']['hostname'] = "server";
$db['default']['username'] = "staging";
$db['default']['password'] = "PASSWORD";
$db['default']['database'] = "staging_$client_name";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "app_";
$db['default']['pconnect'] = FALSE;
$db['default']['db_debug'] = FALSE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_unicode_ci";

此外,我还使用了找到的会话库(用本机会话替换代码点火器会话库: http://www.philsbury.co.uk/index.php/blog/code-igniter-sessions/

我使用memcached存储会话。发生的错误在某种程度上是数据在会话中结束,我认为不应该。下次它会发生,我会有更多的信息,但我只是想排除会话是否可以以任何方式重叠。

编辑:有没有更简洁的方法(在本机上可用)? $ _SERVER [' HTTP_HOST']是否始终可用且安全使用?

    session_start();

      if (!$this->userdata('domain'))
      {
          $this->set_userdata('domain', $_SERVER['HTTP_HOST']);
      }

      if ($this->userdata('domain') != $_SERVER['HTTP_HOST'])
      {
          die(lang('common_session_hijacking_attempt_no_access_allowed'));
      }

1 个答案:

答案 0 :(得分:2)

您只需要为PHP会话ID所在的cookie设置域。

  

bool setcookie(string $ name [,string $ value [,int $ expire = 0 [,string $ path [, string $ domain [,bool $ secure = false [,bool $ httponly] = false]]]]]])

     

<强>域

     

Cookie可用的域。将域设置为“www.example.com”将使www子域和更高子域中的cookie可用。可用于较低域名的Cookie(例如“example.com”)可用于更高的子域名,例如“www.example.com”。仍旧实施已弃用的RFC 2109的旧版浏览器可能需要领先。匹配所有子域。

http://php.net/manual/en/function.setcookie.php

基本上,yoursite.com可用的任何Cookie都可用于该域的任何子域,但如果您将域设置为subdomain.yoursite.com,则父域将无法使用该域。

编辑:

我误解了问题所在,我认为在人们复制cookie的情况下,您可以做的是根据HTTP主机设置session保存位置:

session_save_path("/tmp/" .  $_SERVER['HTTP_HOST']);

然后它理论上应该在每个子域的基础上进行会话 - 即使SESSION ID匹配......它也不会为该子域找到它。但我可能是错的。

或者,既然你在memcache上,你可以应用这个概念,并修改库来命名你的会话:

$_SESSION[$key] = $val;

变为:

$_SESSION[$_SERVER['HTTP_HOST']][$key] = $val;

return ( ! isset($_SESSION[$_SERVER['HTTP_HOST']][$item])) ? false : $_SESSION[$item];

变为

return ( ! isset($_SESSION[$_SERVER['HTTP_HOST']][$item])) ? false : $_SESSION[$_SERVER['HTTP_HOST']][$item];