2

当用户在我的网站上成功通过身份验证时,我将他们的用户 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 没有被添加到数据库上的“被阻止的用户”列表中。我只是不喜欢每次执行某些操作时都会发出另一个数据库请求来检查用户是否进入了阻止列表。尤其是因为阻止用户的情况很少见。有没有办法在不去数据库的情况下检查用户是否被阻止?

谢谢!

编辑

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

4

5 回答 5

0

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

结束用户的会话:

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

unset($_SESSION['user_id']);

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

session_destroy();
于 2013-03-20T01:47:35.150 回答
0

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

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

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

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

于 2013-03-20T01:52:38.060 回答
0

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

if (!!$_SESSION['data']['self_destruct'])
{
    session_destroy();
    header('Location:/');
    exit;
}
于 2013-03-20T02:00:02.970 回答
0

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


查找会话文件

PHP 会话通常存储在/tempor /tmpor/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_*

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

于 2013-03-20T02:03:27.580 回答
-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

 }

您的 Quest 可能有重复项:完全销毁会话的最佳方法 - 即使浏览器未关闭
如何从 PHP 会话数组中删除变量

于 2013-03-20T02:32:09.623 回答