【问题标题】:how to force logout using $_SESSION如何使用 $_SESSION 强制注销
【发布时间】:2013-03-08 23:20:08
【问题描述】:

当用户在我的网站上成功通过身份验证时,我将他们的用户 ID 存储在会话中:$_SESSION['user_id']

然后我在整个站点中使用它来检查用户是否可以执行某些操作。例如

if(isset($_SESSION['user_id'])){
    //User is logged in, allow the following.
    ...
}

...

if ( $_SESSION['user_id'] == $comment_user ) {
    //User owns the comment, go ahead and delete it.
    ...
}

但是,如果我发现登录用户有恶意目的,我该如何终止他们的登录会话以使他们无法执行这些安全操作?

要阻止用户,我可以在数据库上使他们的登录详细信息无效,或者将他们添加到在身份验证时检查的阻止列表中,以便他们无法再进行身份验证。 但是,这只会在他们下次尝试登录时生效。只要当前会话保持活动状态并且他们的用户 ID 存储在会话中,他们就会被视为经过身份验证..强>

  1. 有没有办法取消设置特定会话,强制注销?怎么样?
  2. 如果没有,确保被阻止的用户无法继续访问站点上的安全区域的最佳方法是什么?例如我唯一的想法是不仅仅是检查if(isset($_SESSION['user_id'])),还可以添加一个额外的检查来确保user_id 没有被添加到数据库上的“被阻止的用户”列表中。我只是不喜欢每次执行某些操作时都会发出另一个数据库请求来检查用户是否进入了阻止列表。尤其是因为阻止用户的情况很少见。有没有办法在不去数据库的情况下检查用户是否被阻止?

谢谢!

编辑

到目前为止,大多数答案都涉及如何取消/销毁会话,或如何阻止用户下次登录尝试。我想剩下的唯一问题是如何检查用户当前登录时是否被阻止。有没有一种方法可以做到这一点,而无需每次用户执行时都去数据库检查“被阻止的用户”列表一种行为。这与我的主要问题有关,即上面的粗斜体。如果用户被阻止,那么我可以立即销毁会话(强制注销),他们也将无法再次进行身份验证。

【问题讨论】:

  • 您没有在标签中注明您的操作系统,但我已经根据 linux 和您更新的问题重写了我的答案。

标签: php session authentication


【解决方案1】:

如果您知道用户 ID,您可以随时执行以下操作:

$maliciousUsers = array(1,3,19,24);

if(in_array($_SESSION['user_id'], $maliciousUsers)){
    @session_destroy();
}

我会将$maliciousUsers 数组作为数据库中的一个表。这样,如果您看到发生了什么事,将他们的 ID 扔到表中,它就会被反映。如果他们能够验证并收到$_SESSION['user_id'],那么这将销毁它。

【讨论】:

    【解决方案2】:

    当使用会话进行身份验证时,传统上是使用用户名和存储为会话变量的某种哈希密码来完成的。这是一个很好的资源:@​​987654321@

    结束用户的会话:

    通过您的设置,您可以简单地删除会话变量,让用户结束他们的会话

    unset($_SESSION['user_id']);
    

    或者您可以像这样简单地结束会话:

    session_destroy();
    

    【讨论】:

    • unsset 有一点错别字。它应该未设置。
    【解决方案3】:

    我倾向于在会话表中添加自毁。在他们下次登录时,应用会检查这一点。

    if (!!$_SESSION['data']['self_destruct'])
    {
        session_destroy();
        header('Location:/');
        exit;
    }
    

    【讨论】:

      【解决方案4】:

      假设您正在使用数据库,将会话标识符存储在其中并禁止他们将来登录,那么实现此目的的最简单方法是另外从您的文件中删除他们的会话文件-系统。


      查找会话文件

      PHP 会话通常存储在 /temp/tmp/var/lib/php5/ 目录中(它会有所不同) - 尽管 默认 session.save_path 设置为 "",但您可以设置使用位置:

      session_save_path('/path/to/session/dir');
      

      甚至在您的.htaccess 文件中:

      php_value session.save_path /path/to/session/dir/
      


      会话文件的存储方式

      会话文件在文件系统中以 sess_ 为前缀:

      -rw-------  1 www-data www-data    0 2013-04-19 05:39 sess_141d2215ce74452ea6b1f69eea228159
      

      其中,在上面的例子中包含:

      AutoLogout|s:4:"3600";FirstName|s:4:"John";Lang|s:2:"en";LastLogin|s:19:"2013-04-19 17:26:18";LastName|s:8:"Smith";RegDate|s:19:"2012-11-12 17:18:13";TimeOut|i:1366421178;UserEmail|s:22:"johnsmith@domain.com";UserId|s:1:"3";authenticatedUser|s:22:"johnsmith@domain.com";year|s:4:"2013";
      

      只要您有他们的 ID 记录(假设在您的数据库中),您就可以通过编程方式删除它们。


      使用 PHP 即时删除会话文件

      PHP 提供了使用unlink() 删除文件的功能,因此,当禁止用户并阻止他们登录(将来)时,您还可以通过将类似这样的内容附加到您的禁止功能或创建一个即时踢功能,使用类似的东西:

      $sessionID = 'sess_'.$sessionIdFromDB;
      $sessionDir = '/path/to/session/dir'; // Wherever your sessions are stored
      unlink($sessionDir."/".$sessionID); 
      

      但是,此技术假定您有权删除相关会话文件。如果您不这样做,那么您需要调整文件权限或使用chown() 和/或chmod() 或在您的文件系统上更改它们。


      手动删除

      您也可以使用终端手动删除会话文件。虽然这看起来毫无意义,但我曾经看到它在过去用于在执行特定业务之前立即将所有用户踢出:

      //SSH
      cd /path/to/session/dir
      rm -rf sess_*
      

      一旦执行,所有用户会话将失效。

      【讨论】:

        【解决方案5】:

        有没有办法取消设置特定会话,强制注销?怎么样?

        最好执行快速注销

        May be late but commented
        

        //相应地改变!

        function doLogout()
        {
                //clear session from globals
                $_SESSION = array();
                //clear session from disk
                session_destroy();
                //delete the session cookie using setcookie.
                $cookieParams = session_get_cookie_params();
                setcookie(session_name(), '', 0, $cookieParams['path'], $cookieParams['domain'], $cookieParams['secure'], $cookieParams['httponly']);
                //unset the session variable
                unset($_SESSION);
                doBlock();   
        
        }
        
            function doBlock()
                {               
        
             //Start and Set Blocking session ,presence of it must be 
            //validated at first on any secure Areas Entrance   , 
           //it may not be secure if Session is Cleared by end Mal User) ,
          // if extreme   security is needed  then
         //Ugly block Remote IP is needed //(12-24 hr) Block
        
         }
        

        您的任务可能有重复:Best way to completely destroy a session - even if the browser is not closed
        How to remove a variable from a PHP session array

        【讨论】:

        • 感谢您对如何销毁会话的回复。请查看我在关于检查用户是否被阻止的问题中的编辑。
        猜你喜欢
        • 1970-01-01
        • 2013-12-04
        • 1970-01-01
        • 2016-11-12
        • 1970-01-01
        • 2014-11-12
        • 2019-08-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多