更改网络时,PHP SESSION(使用myPajamas登录脚本)无法正常工作

时间:2012-05-30 20:38:35

标签: php networking cross-browser session-cookies sessionid

我在网上到处都是,SESSION变量的细微差别需要我一些澄清。

我有一个设置会话变量的网站(我假设它还设置了一个定义会话ID的cookie?不确定它是如何工作的),并且一切都很完美。我通过手机漫游(使用wifi)时发现,无论何时手机切换wifi网络,浏览器似乎都无法再访问会话,直到该窗口/标签关闭并重新打开。

根据我的阅读以下内容,请为我澄清:

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

  2. 如果切换了网络,服务器会创建一个新的会话ID,但由于浏览器窗口未关闭,旧会话cookie未被销毁,浏览器会尝试操作过期的会话ID(会话cookie中包含旧的那个)?不知道这是不是真的,我已经阅读了一些荒谬的页面,我找不到具体的东西。但这是我得到的印象。我已经看到很多关于session_regenerate_id()的警告,我对使用它感到非常紧张......

  3. 有关此方面的详细信息或解决方法的帮助将非常有帮助。我在我的智慧结束......

    更新

    我正在使用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 个答案:

答案 0 :(得分: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上访问相同的网址,则没有理由说会话将更改/受网络交换机的影响。如果必须关闭浏览器窗口,并发现会话数据消失,那么问题只在于将会话cookie的生命周期设置为0以外的值。在session_start()之前放置以下行: / p>

session_set_cookie_params(X);

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

答案 1 :(得分:-1)

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

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