首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在codeigniter应用中php会话可以重叠吗?

问在codeigniter应用中php会话可以重叠吗?
EN

Stack Overflow用户
提问于 2014-08-02 06:25:00
回答 1查看 321关注 0票数 0

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

我在application/config/database.php中有以下内容

代码语言:javascript
复制
$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来存储会话。正在发生的错误是数据以某种方式结束在会话中,我认为这是不应该的。下一次我会有更多的信息,但我只是想排除会话是否会以任何方式重叠。

编辑:有没有一种更干净的方式来做这件事(在php中可用)?$_SERVER‘’HTTP_HOST‘是否始终可用且可安全使用?

代码语言:javascript
复制
    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'));
      }
EN

回答 1

Stack Overflow用户

发布于 2014-08-02 07:05:25

您只需要为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”将使cookie在www子域和更高的子域中可用。Cookie可用于较低的域,如“example.com”,将可用于较高的子域,如“www.example.com”。仍在实现已弃用的»RFC2109的旧浏览器可能需要一个前导。匹配所有子域。

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

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

编辑:

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

代码语言:javascript
复制
session_save_path("/tmp/" .  $_SERVER['HTTP_HOST']);

然后,理论上它应该在每个子域的基础上拥有会话-即使会话ID匹配...它不会为那个子域找到它。但我可能错了。

或者,由于您使用的是memcache,您可以应用这个概念,并修改库来命名您的会话:

代码语言:javascript
复制
$_SESSION[$key] = $val;

变成:

代码语言:javascript
复制
$_SESSION[$_SERVER['HTTP_HOST']][$key] = $val;

和

代码语言:javascript
复制
return ( ! isset($_SESSION[$_SERVER['HTTP_HOST']][$item])) ? false : $_SESSION[$item];

变成了

代码语言:javascript
复制
return ( ! isset($_SESSION[$_SERVER['HTTP_HOST']][$item])) ? false : $_SESSION[$_SERVER['HTTP_HOST']][$item];

等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25089570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档