【问题标题】:Destroying Session - Logs me out to current system and the other system销毁会话 - 让我退出当前系统和其他系统
【发布时间】:2018-02-13 08:21:05
【问题描述】:

大家好,我只是有一个问题,

在 localhost 我有几个系统,当我打开 2 个或更多系统时,我登录第一个,然后另一个还没有会话。

但是当我注销其中一个时,所有会话都被破坏了。正常吗? 还是一种漏洞?

当你像localhost一样在同一台服务器中销毁会话时,它会销毁其中的其他会话吗?

http://localhost/system1    Active Session  $_SESSION['admin']
http://localhost/system2    Active Session  $_SESSION['admin']

我用 session_destroy() 注销 http://localhost/system1 然后结果是

http://localhost/system1    Inactive Session  
http://localhost/system2    Inactive Session

任何帮助表示赞赏!谢谢

【问题讨论】:

  • session_destroy 销毁注册到会话的所有数据,因此即使来自您其他系统的会话也将被销毁
  • unset() 可能有助于释放您选择的会话密钥=>值
  • @Swellar 和 Soni Vimal,感谢您提供的信息! :)

标签: php


【解决方案1】:

如果两个系统都使用相同的会话 ID(换句话说,它意味着相同的会话文件/实体),那么是的,这是正常的。因为您实际上只有一个会话,其中包含来自几个系统的数据。

您的系统可以使用不同的会话,但为此您需要手动生成会话 ID(查看 http://php.net/manual/en/function.session-create-id.php 和 http://php.net/manual/en/function.setcookie.php 了解如何更改 cookie 路径)。

在您的情况下,最简单的解决方案是从会话中取消设置系统数据(注销时),然后不会删除其他系统数据。

【讨论】:

    【解决方案2】:

    会话在主机上被销毁,

    如果您使用的是 Apache,您可以使用虚拟主机来创建本地域。然后访问 example.local 或 example2.local 上的每个站点

    <VirtualHost *:80>
        DocumentRoot "/www/example1"
        ServerName www.example.local
    
        # Other directives here
    </VirtualHost>
    
    <VirtualHost *:80>
        DocumentRoot "/www/example2"
        ServerName www.example2.local
    
        # Other directives here
    </VirtualHost>
    

    在此处了解更多信息:https://httpd.apache.org/docs/current/vhosts/examples.html

    或者您可以尝试使用 PHP 内置 Web 服务器,方法是在一个文件夹的 Web 根目录中运行 php -S localhost:8000,在另一个文件夹的 Web 根目录中运行 php -S localhost:8001。然后您可以通过http://localhost:8000 和http://localhost:8001 访问它们。虽然还没有测试过这个。

    http://php.net/manual/en/features.commandline.webserver.php

    另一种选择是使用命名会话http://php.net/manual/en/function.session-name.php

    【讨论】:

      【解决方案3】:

      会话是为主机而不是子文件夹设置的。 当您创建会话时,它会在 localhost 上创建, 现在您的 system1 和 system2 都可以访问该会话变量,

      使用 session_destroy(); 会从您的主机销毁会话。所以它会删除所有会话引用。

      我认为您会特别想取消设置特定站点的变量。所以就用这个吧。

      unset($_SESSION['system1session']);
      

      希望有帮助

      【讨论】:

        【解决方案4】:

        您可以为每个会话使用不同的名称。

        PHP 有一个会话名称函数,它指定 Cookie 的名称,因此两个不同的名称将有自己的范围和 ID。

        一个文件:

        session_name("ServerApp1"):;
        session_start();
        
        $_SESSION["a"] = ...
        

        其他文件:

        session_name("ServerApp2"):;
        session_start();
        
        $_SESSION["a"] = ...
        

        使用这种方法,您可以在一个文件中破坏 Session,而另一个文件将保持不变。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-26
          • 2019-12-08
          • 2018-11-28
          • 2020-06-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多