我正在尝试确定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'));
}
答案 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];
等