当前位置: 首页 > 知识库问答 >
问题:

PHP 会话(使用 myPajamas 登录脚本)在更改网络时不起作用

蔡鸿骞
2023-03-14

我在网上到处都找过了,SESSION变量的细微差别需要对我进行一些澄清。

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

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

> < li>

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

如果网络被切换,服务器会创建一个新的会话ID,但是因为浏览器窗口没有关闭,旧的会话cookie没有被破坏,浏览器试图操纵过期的会话ID(会话cookie包含的旧会话ID)?不知道这是不是真的,我已经读了很多关于这个的页面,找不到任何具体的东西。但这就是我得到的印象。我看到了很多关于session_regenerate_id()的警告,以至于我对使用它非常紧张…

任何有关此问题的详细信息或解决方法的帮助都将非常有用。我已到了绝境。。。

更新

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

颜霖
2023-03-14

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

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

谭京
2023-03-14

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

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

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

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

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

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

session_set_cookie_params(X);

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

 类似资料:
  • 问题内容: 这里的另一个新手..我正在尝试修复以下代码,以防止sql注入,并学习编写php和sql的新方法。 您的建议将不胜感激。 我修改了这个 为此,我没有得到相同的结果。 问题答案: 您不能将mysql与mysqli或PDO混合使用。您需要查看错误日志,因为这不可能实现-您应该看到大量致命错误。

  • 问题内容: 我刚刚完成了在PHP中创建整个登录和注册systsem的操作,但是我的问题是我还没有使用任何会话。我是PHP的新手,以前从未使用过会话。我想做的是,在用户注册并填写登录表单后,他们仍将停留在同一页面上。因此,其中一部分将是会话已登录,另一部分将是其他(用户未登录,请显示登录表单)。谁能告诉我如何开始? 问题答案: 希望这可以帮助 :) 开始会话,您需要在页面顶部或在调用会话代码之前说出

  • 问题内容: 我正在尝试设置回合部署脚本。我在使用远程登录时遇到了一些麻烦。在远程服务器上创建数据库时,我们需要使用sql帐户(而不是计算机或域,这是针对Server 2008 R2 SP1上的MSSQL 2008R2)登录。有没有办法为回旋连接和运行脚本提供不同的凭据,因为我在文档中没有看到它?谢谢。 问题答案: 如果指定连接字符串而不是服务器名称和数据库名称,则还可以设置凭据。 来自:https

  • 所以我有一个相当标准的登录页面:

  • 问题内容: 我想实现一个userland命令,该命令将使用其参数之一(路径)并将目录更改为该目录。程序完成后,我希望外壳位于该目录中。所以我想用外部程序来实现命令。 可以在python脚本中完成还是必须编写bash包装器? 例: 问题答案: 其他人指出,您不能从孩子那里更改父母的工作目录。 但是有一种方法可以实现您的目标-如果从shell函数中进行cd,则 可以 更改工作目录。将此添加到您的〜/

  • 我正在开发一个vaadin web应用程序,我在web.xml中添加了以下代码片段。 现在我注意到,也在30分钟后,我的用户能够使用应用程序,我不想这样。我在vaadin的书上读到了一些关于这个问题的东西,但我并不了解一些东西。 在web.xml中: 会话超时应长于心跳间隔,否则会话在心跳保持活动之前就已关闭。由于会话过期使UI处于假定会话仍然存在的状态,这将在浏览器中导致不同步错误通知。 但是,