0

我在网上到处查看,SESSION 变量的细微差别需要我澄清一下。

我有一个设置会话变量的网站(我假设它还设置了一个 cookie 来定义会话 id 是什么?不确定它是如何工作的),并且一切正常。我在通过手机漫游(使用 wifi)时发现,每当手机切换 wifi 网络时,浏览器似乎无法再访问会话,直到该窗口/选项卡关闭并重新打开。

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

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

  2. 如果网络切换,服务器会创建一个新的会话 id,但是由于浏览器窗口没有关闭,旧的会话 cookie 没有被销毁,浏览器会尝试操作一个过期的会话 id(旧的会话 cookie包含)?不知道这是否属实,我已经阅读了很多页,但我找不到任何具体的内容。但这是我得到的印象。我已经看到很多警告session_regenerate_id(),我对使用它感到非常紧张......

任何有关此问题的详细信息或解决方法的帮助都将非常有帮助。我已经黔驴技穷了...

更新

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

我不敢相信我无法弄清楚这一点,我花了几个小时寻找有关会话 ID 更改的问题。

希望它可以帮助将来遇到类似问题的人。衷心感谢所有阅读这篇文章的人,您在评论中的指导绝对帮助我解决了这个问题。

编辑代码

类.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;
    }*/
}
4

2 回答 2

1

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

1) 会话 cookie 有一个生命周期。如果您的代码未指定生命周期,则该值默认为您的 php 配置中的任何值。做一个 phpinfo(); 并查找session.cookie_lifetime,这是一个以秒为单位的值。值 0 表示 cookie 在浏览器窗口关闭时过期。

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

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

(根据您的编辑,事实确实如此。)

如果您在网络 A 和网络 B 上访问相同的 url,那么会话没有理由更改/受网络交换机影响。如果你不得不关闭浏览器窗口,并且发现你的会话数据不见了,那么问题就在于将会话cookie的生命周期设置为0以外的值。将以下行放在session_start()之前:

session_set_cookie_params(X);

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

于 2012-05-30T20:58:27.817 回答
-1

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

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

于 2012-05-30T20:57:58.347 回答