我在网上到处查看,SESSION 变量的细微差别需要我澄清一下。
我有一个设置会话变量的网站(我假设它还设置了一个 cookie 来定义会话 id 是什么?不确定它是如何工作的),并且一切正常。我在通过手机漫游(使用 wifi)时发现,每当手机切换 wifi 网络时,浏览器似乎无法再访问会话,直到该窗口/选项卡关闭并重新打开。
根据我所阅读的以下内容,请为我澄清:
当浏览器窗口关闭时,会话 cookie 被破坏,因此当我重新打开它时,会创建一个新的 cookie,并附加到新的会话 id。从而允许会话再次正常工作?
如果网络切换,服务器会创建一个新的会话 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;
}*/
}