如何使用$ _SESSION强制注销

时间:2013-03-20 01:42:03

标签: php session authentication

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

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

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.
    ...
}

但是,如果我发现签名用户有恶意目的,我怎样才能杀死他们的登录会话,以便他们无法执行这些安全操作?

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

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

    修改

    到目前为止,大多数答案都解决了如何取消/销毁会话,或如何阻止用户下次登录尝试。我想剩下的唯一问题是如何在用户当前登录时检查用户是否被阻止。是否有办法在每次用户执行时不去DB查看“阻止的用户”列表的情况下执行此操作一种行为。这与我的主要问题有关,在上面的 粗体斜体 中。如果用户被阻止,那么我可以立即销毁会话(强制注销),并且还将阻止他们再次进行身份验证。

5 个答案:

答案 0 :(得分:0)

使用会话进行身份验证时,传统上使用用户名和某种散列密码存储为会话变量。这是一个很好的资源:php sessions to authenticate user on login form

结束用户的会话:

使用您的设置,您只需删除会话变量,以便用户结束会话

unset($_SESSION['user_id']);

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

session_destroy();

答案 1 :(得分:0)

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

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

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

我会将$maliciousUsers数组作为数据库中的表。这样,如果你看到发生了什么事,就把他们的ID扔进桌子,然后就会反映出来。如果他们能够进行身份验证并接收$_SESSION['user_id'],则会破坏它。

答案 2 :(得分:0)

我倾向于在会话表中放入自毁。在下次登录时,应用程序会对此进行检查。

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

答案 3 :(得分:0)

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


查找会话文件

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_*

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

答案 4 :(得分:-1)

  

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

更好地执行快速注销

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