2013-03-20 150 views
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尚未被添加到数据库的“阻止用户”列表。我只是不喜欢做另一个数据库请求来检查用户是否每次执行某些操作时都进入了阻止列表。特别是因为阻止用户会很少发生。有没有办法检查用户是否被阻止,而不去数据库?

谢谢!

编辑

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

+0

你不表示你的操作系统在你的标签,但我已经基于Linux和更新的问题,重写我的答案。 – nickhar 2013-04-20 02:02:26

回答

0

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

结束用户会话:

您的设置,你可以简单地删除会话变量为用户结束其会话

unset($_SESSION['user_id']); 

,或者你可以简单地这样结束了本届会议:

session_destroy(); 
+0

未定有一个错字。它应该是未设置的。 – 2013-03-20 02:19:11

0

如果您知道用户ID,你总是可以这样做:

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

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

我会做$maliciousUsers阵列作为数据库中的表。这样,如果你看到有什么事情发生,把他们的身份证扔进桌子,它会被反映出来。如果他们能够验证并接收到$_SESSION['user_id'],那么这将破坏它。

0

我有一个倾向,在会议表中放入自毁。在他们的下一次登录时,应用会检查这个。

if (!!$_SESSION['data']['self_destruct']) 
{ 
    session_destroy(); 
    header('Location:/'); 
    exit; 
} 
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:"[email protected]";UserId|s:1:"3";authenticatedUser|s:22:"[email protected]";year|s:4:"2013"; 

只要你有他们的ID的记录(假设你的数据库),你可以编程删除它们。


删除立即使用PHP

PHP提供了使用unlink()删除文件的能力,因此,禁止用户,并防止他们在登录(在未来)当会话文件,你也可以

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

然而,这种技术假定您有权删除S:通过附加这样的事情您的禁止功能或创建一个即时踢功能,使用类似禁止他们瞬间有问题的激情文件。如果您不这样做,则需要调整文件权限或使用chown()和/或chmod()或在文件系统上更改它们。


手动删除

您还可以删除使用终端手动会话文件。虽然这也许显得毫无意义,我已经看到了它在过去使用瞬间踢所有用户都出来做一些具体的业务之前:

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

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

-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

+0

感谢您对如何销毁会话的回复。请在我的问题中查看关于检查用户是否被阻止的编辑。 – 2013-03-20 02:52:02