【问题标题】:Same Session ID on Same IP Address but Different Ports相同 IP 地址但不同端口上的相同会话 ID
【发布时间】:2012-11-16 08:24:37
【问题描述】:

我在两台不同的计算机上运行我的网站(完全相同的源代码,甚至用户登录详细信息),每台计算机都有自己的 apache。 用户可以通过我的端口转发设置访问这两个网站。

例如,10.10.10.10:81 访问计算机 A 上的网站,10.10.10.10:82 访问计算机 B 上的网站。

用户访问其中任何一个都没有问题。直到用户想使用同一个互联网浏览器同时访问它们。

在计算机 B 上登录网站会将他/她从计算机 A 上的网站注销。

为什么会这样? 因为相同的 IP 地址会自动生成相同的会话 ID? 不同的端口不会有不同的Session ID? 如何避免这种情况?手动生成Session ID会怎样?此问题还有其他解决方案吗?

谢谢。

【问题讨论】:

    标签: apache session port


    【解决方案1】:

    Cookie 并不特定于某个端口。

    这意味着如果在 10.10.10.10:81 上运行的服务器设置 cookie sessionId=123455,则相同的 cookie 将被发送到在 10.10.10.10:80。它导致您描述的场景

    • 用户访问服务器 10.10.10.10:81
    • 10.10.10.10:81 服务器为该用户建立会话并设置 cookie。
    • 用户登录到服务器,现在可以使用会话浏览。
    • 用户然后转到 10.10.10.10:80 并且浏览器发送由 10.10.10.10:81 设置的会话 cookie
    • 因为 10.10.10.10:80 对 10.10.10.10:81 上的会话一无所知,它会建立一个新会话并设置新的会话 cookie 覆盖旧的会话
    • 新会话 cookie 仅在 10.10.10.10:80 有效,因此用户在 10.10.10.10:81 上注销

    解决方案

    • (首选)为会话 cookie 配置不同的名称 或
    • 配置服务器在设置会话cookie标头时传递端口参数。这将使 cookie 特定于域+端口组合。尽可能避免使用此解决方案,因为并非所有浏览器都能正确处理此参数。

    【讨论】:

      【解决方案2】:

      您没有提供很多信息,但如果使用 cookie 维护会话,并且使用相同的域名来访问两个站点,那么 cookie 将应用于对两个站点的请求。

      当用户从站点 A 切换到站点 B(使用相同的浏览器实例)时,会话 cookie 将被发送,但不会与现有会话 ID 匹配 - 因此站点 B 将生成一个新的会话 ID,并且设置为“该”会话 cookie。

      解决此问题的两种通用方法 - 为两个站点使用两个不同的域名,或以其他方式区分会话 cookie。您可以通过为站点 A 和站点 B 中的会话 cookie 配置不同的名称来做到这一点。这样做的细节取决于用于创建站点 A 和 B 的技术 - 您尚未告诉我们关于。

      【讨论】:

      • 您还需要其他信息吗?我正在使用 Yii (php),我没有手动设置任何会话或 cookie。我使用的是 IP 地址而不是域名。我认为使用不同的 IP/域可以避免这种情况,但我只获得了一个 IP 地址。谢谢。
      • @AlyshaSantana - 我自己没有使用 Yii,但 sessionName 看起来可能是您需要设置的候选对象。
      • 抱歉,我不是 Alysha Santana,我不知道为什么我在注册时将其作为我的显示名称。你的意思是我必须手动设置我的会话?除了手动设置会话之外,还有其他解决方案吗?谢谢。
      • @Wooi - 正如我所说,我自己没有使用过 Yii,所以我不会假装自己是专家。我通过搜索 Yii session cookie name 找到了上述链接 - 您可能会通过其他链接获得更好的运气和更多的知识。
      • 我觉得跟 Yii 没什么关系,因为我其他使用 java 的网站也会有类似的问题。
      【解决方案3】:

      这是解决它的示例:

      127.0.0.1:110
      session_start();
      $_SESSION['ss'] = 'll'; 
      echo '<pre>';
      var_dump( $_SESSION);
      
      ouput: 
      array(1) {
       ["ss"]=>
        string(2) "ll"
      }
      
      127.0.0.1:111
      session_start(); 
      echo '<pre>';
      var_dump( $_SESSION);
      
      ouput: 
      array(1) {
       ["ss"]=>
        string(2) "ll"
      }
      

      更改会话路径后

      127.0.0.1:110
      session_save_path('/tmp/sess');//This line must be wrote before session_start(),
      session_start();
      $_SESSION['ss'] = 'll'; 
      echo '<pre>';
      var_dump( $_SESSION);
      
      ouput: 
      array(1) {
       ["ss"]=>
        string(2) "ll"
      }
      
      
      127.0.0.1:111
      session_start(); 
      echo '<pre>';
      var_dump( $_SESSION);
      
      ouput: 
      array(0) {
       }
      
       127.0.0.1:111
      session_save_path('/tmp/sess');
      
      session_start();
      $_SESSION['ss'] = 'll'; 
      echo '<pre>';
      var_dump( $_SESSION);
      
      ouput: 
      array(1) {
       ["ss"]=>
        string(2) "ll"
      }
      

      【讨论】:

        猜你喜欢
        • 2014-08-06
        • 2011-03-08
        • 1970-01-01
        • 2011-02-05
        • 2019-08-11
        • 2015-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多