Force o usuário a sair session PHP

Não consigo achar uma resposta direta a esta questão. Existe uma maneira pela qual eu posso forçar um usuário logado a sair? O meu sistema de login basicamente basta em uma session contendo a ID exclusiva do usuário (que está armazenada em um database mysql). Então, essencialmente, apenas …

if (isset($_SESSION['user_id'])) { echo "You're logged in!"; } else { echo "You need to login!"; } 

Mas digamos que eu quero banir esse usuário, bem, eu posso mudar seu status para ser banido no meu database, mas isso não fará nada até que o usuário faça o login e tente fazer login novamente … Então, como faço para forçar esse usuário? para sair? De preferência, sem verificar todas as vezes que visualizam uma página, se o status deles foi ou não alterado para “banido” porque isso parece um estresse desnecessário no meu servidor. Qualquer ajuda é apreciada, obrigado.

Ou você precisa verificar cada vez que carrega uma página, ou talvez veja uma chamada do Ajax em intervalos estabelecidos para verificar seu status a partir do database.

Então você pode usar session_destroy(); para terminar a session. Isso destruirá toda a session.

Caso contrário, você pode usar unset($_SESSION['user_id']); desmarcar uma única variável de session

De preferência, sem verificar todas as vezes que visualizam uma página, se o status deles foi ou não alterado para “banido” porque isso parece um estresse desnecessário no meu servidor.

Carregar o usuário do database em cada carregamento de página, ao invés de armazenar uma cópia do usuário na session, é uma solução perfeitamente razoável. Também impede que o usuário fique fora de sincronia com a cópia no database (de modo que, por exemplo, você pode alterar as propriedades ou permissions de um usuário sem ter que se desconectar e voltar).

Você pode desatualizá-lo.

 unset($_SESSION['user_id']) 

Você pode usar manipuladores de session personalizados dessa maneira, você tem controle total onde e como os dados da session são armazenados no servidor.

Então, você pode armazenar os dados da session para um determinado usuário em um arquivo chamado .session por exemplo. Então, para sair do usuário, basta excluir esse arquivo.

As chamadas do Ajax em um intervalo colocam carga extra no servidor. Se você deseja uma resposta em tempo real às suas ações (por exemplo, o usuário será desconectado quando proibi-las do backend do sistema), então você deve procurar algo como Server Push .

A idéia é manter um túnel aberto do Servidor ao Navegador sempre que um usuário estiver navegando em seu site, para que você possa se comunicar com eles do lado do servidor também. Se você deseja que eles sejam banidos, pressione uma solicitação de logout e o processo que em sua página (ou seja, efetue a interrupção da força ao cancelar a session).

Tente colocar isso em todas as páginas …

 if (isset($_SESSION['user_id'])) { $sql = "SELECT from tbl where status='banned' and user_id=$_SESSION['user_id'] "; $query = mysql_query($sql); if(!empty(mysql_num_rows($query))){ // found the banned user //redirect to logout or //session_destroy(); } } else { echo "You need to login!"; } 

se o usuário ainda estiver logado … verifique se o status dele está proibido ou não … se for banido .. então faça o login

Isso funcionou para mim estou usando o pHP 5.4 incluem ‘connect.php’;

  session_start(); if(session_destroy()) { header("Location: login.php"); } 

Você pode usar session_save_path() para encontrar o caminho onde o PHP salva os arquivos da session e, em seguida, exclua-os usando unlink() .

Depois de excluir o arquivo de session armazenado no separador, o cookie PHPSESSID lado do cliente não será mais válido para autenticação e o usuário será automaticamente desativado de sua aplicação.

Tenha muito cuidado ao usar essa abordagem, se o caminho em questão for o diretório global / tmp! É provável que haja outros processos além do PHP armazenando dados temporários lá. Se o PHP tiver seu próprio diretório reservado para os dados da session, ele deve ser bastante seguro.

Existem algumas maneiras de fazer isso, o melhor na minha opinião com base na segurança é: NOTA: ESTE É REALMENTE ESSERADO … Eu sei que a syntax está errada, é apenas para você ter uma idéia.

 $con = mysql_connect("localhost","sampleuser","samplepass"); if (!$con) { $error = "Could not connect to server"; } mysql_select_db("sampledb", $con); $result = mysql_query("SELECT * FROM `sampletable` WHERE `username`='".$_SESSION['user_id']."'"); $userdeets = mysql_fetch_array($result); if($_SESSION['sessionvalue'] != $userdeets['sessionvalue']) { session_destroy(); Header('Location: logout.php'); } else { $result2 = mysql_query("UPDATE `sessionvalue` WHERE `username`='".$_SESSION['user_id']."' SET `sessionvalue` = RANDOMVALUE''"); $sesval = mysql_fetch_array($result2); $_SESSION['sessionvalue'] = $seshval } 

Agora eu sei que não é o código mesmo, mas, em essência, o que você precisa fazer para ser seguro e ter essa habilidade é:

  • Toda vez que um carregamento de página verificar um valor de Sessão corresponde a um valor no database.
  • Toda vez que uma página carrega, configure um novo valor de session com base em um valor de DB gerado aleatoriamente. Você também precisará armazenar o nome de usuário em uma session.
  • se as ID da Sessão não coincidem, então você destruirá a session e redirecioná-las-á.
  • Se for compatível, você faz a nova ID da session.

Se você deseja banir um usuário, você pode configurar seu valor de session no database para um valor como “PROIBIDO”. Este valor não permitirá que eles também façam login. Desta forma, você pode controlar o usuário através de um formulário web simples e você também pode gerar lista de usuários banidos com muita facilidade, etc etc. Eu gostaria de ter mais tempo para explicar. Espero que isso ajude.