2012-05-30 74 views
0

我已经到处找在网络上不工作时,和会话变量的细微之处需要澄清一些对我来说。PHP会话(使用myPajamas登录脚本)改变网络

我有一个网站,设置会话变量(我认为这也将定义会话ID是什么?不知道如何工作的一个cookie),和所有完美的作品。我在使用手机漫游(使用wifi)时发现的情况是,只要手机切换wifi网络,浏览器似乎无法再访问该会话,直到该窗口/标签关闭并重新打开。

从我读过以下申请什么,请说明对我来说:

  1. 当浏览器窗口关闭时,会话cookie被破坏,因此当我重新打开它,创建一个新的Cookie附到新的会话ID。从而允许会话再次正常工作?

  2. 如果网络切换,服务器将创建一个新的会话ID,但由于浏览器窗口未关闭,旧的会话cookie未被销毁,浏览器尝试操作过期的会话ID(旧的会话cookie包含)?不知道如果这是真的,我已阅读了这个荒谬的页数,我找不到任何具体的。但这是我得到的印象。我见过这么多的警告有关session_regenerate_id(),我对其非常紧张......

任何帮助,关于这个细节,或方法来解决这将是非常有益的。我在我束手无策......

UPDATE

我使用的是mypajamas脚本,以方便登录。会话正常创建。但是,在查看代码后,我找到了一个为$_SERVER['REMOTE_ADDR']$_SERVER['HTTP_USER_AGENT']值设置会话变量的位置。然后交叉引用它们以确保它在同一IP上的相同浏览器上是同一用户。这是为了防止多源攻击(不可能发生劫持)。问题是使用移动浏览器时,或动态IP的IP可以肯定会改变,认证失败。

我无法相信我能不知道这一点,我花了几个小时寻找关于会话ID的变化问题。

希望这可以帮助别人,在今后类似的问题。并且对所有阅读这篇文章的人表示衷心的感谢,您在评论中的指导无疑帮助我解决了这个问题。

编辑的代码

class.mypajamas.php

来源:

function check_ipau() { // user visits again... but is it really him? check values set above (by get_session()) 
    if($_SESSION['auth'.$this->_unique_id]['ip'] == $_SERVER['REMOTE_ADDR'] 
    && $_SESSION['auth'.$this->_unique_id]['ua'] == $_SERVER['HTTP_USER_AGENT']) { 
     // session data is correct -> user did not "change" ip-address or user agent (aka; hijack is unlikely) 
     return true; 

    } 
    else { 
     return false; 
    } 
} 

要:

function check_ipau() { // user visits again... but is it really him? check values set above (by get_session()) 
    /*if( $_SESSION['auth'.$this->_unique_id]['ip'] == $_SERVER['REMOTE_ADDR'] 
    && $_SESSION['auth'.$this->_unique_id]['ua'] == $_SERVER['HTTP_USER_AGENT']) { 
     // session data is correct -> user did not "change" ip-address or user agent (aka; hijack is unlikely) 
     */ 
     return true; 
     /* 
    } 
    else { 
     return false; 
    }*/ 
} 
+2

你使用直接PHP还是你使用框架?你当前的会话处理代码是什么样的? (或者这不是你的代码?) – Doon

+1

1.不一定。 Cookie可以设置为生存任意时间。如果cookie被删除,那么会话不见了。 2.我不知道你的意思是“网络交换”。默认情况下,PHP中的会话数据是服务器上由cookie中的id附加的小文件。物理网络与它无关。 – Cfreak

+0

它是直接的PHP,没有框架。我将在此处将会话创建显示为更新...首先让它可读,然后给我一两分钟:) – MaurerPower

回答

1

首先,会话变量实际上是cookie。

1)会话cookie有一个生命周期。如果你的代码没有指定生命周期,那么该值默认为你的php配置中的任何值。做一个phpinfo();并寻找session.cookie_lifetime,这是一个以秒为单位的值。值为0意味着当浏览器窗口关闭时cookie会过期。

2)如果您的代码使用样板PHP会话处理,那么问题不太可能与用户的IP地址更改有关。 PHP会话不存储客户端ips,只要你连接的应用程序在两个网络上都有相同的域名/公共IP,那么你应该没问题。 (请参阅PHP Session Cookies fail with users changing IP

可能会有一些额外的会话处理存储客户端的IP,但必须进行自定义编码,而不是基于任何内置功能。

(根据您的修改,这是事实上的情况下)。

如果您正在访问的网络A和网络B相同的URL,那么没有理由会意志更改/受网络交换机的影响。如果您必须关闭浏览器窗口,并且发现会话数据不存在,那么问题仅仅在于将会话cookie的生存期设置为非0值。在session_start()之前放置以下行:

session_set_cookie_params(X); 

其中X是一个以秒为单位的值,在该值之后cookie将过期。请记住,如果您在之前每 session_start()实例调用上述代码,那么该cookie将永远不会过期,因为每个页面都会将该柜台提前一小时重置。

-1

会话只有服务器端。不幸的是,如果你来自不同的网络地址,会话将无效。

如果您想要保留会话值,一个很好的做法是创建您自己的Cookie,以便您知道某人曾经被认证/拥有有效会话。然后,您首先检查会话值是否已设置,如果不检查该cookie。如果该cookie存在且具有良好的价值,则可以将该会话值重新设置为cookie的值(或者像在进行身份验证时那样设置会话)。如果没有会话并且没有cookie,则该会话被假定为不存在。