Problem with login / logout in PHP

1

I have a small login / logout system in PHP / MySQL where when I log off, and try to enter again at the same time, the page does not enter. It only works after a few minutes. What would it be?

pegasenha.php (page where I do the post (ajax))

include "abre_banco.php";

$usuario=$_POST["usuario"];
$senha=md5($_POST["senha"]);

$parametro="SELECT * FROM login WHERE nome='$usuario'";
$resultado=mysql_query($parametro);
$quantidade=mysql_num_rows($resultado);
$dados=mysql_fetch_row($resultado);

if ($quantidade==0) {          // usuario nao cadastrado
   echo "0";
}
else {                          // confere senha
     if ($senha!=$dados[1]) {   // senha incorreta
        echo "0";
     }
     else { 
        session_start();
        $_SESSION["nome_usuario"]=$usuario;
        $_SESSION["senha_usuario"]=$senha;
        echo "1";
     }
}
?>

logout.php

if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time()-42000, '/');
}

// Finally, destroy the session.
session_destroy();

header ("Location: index.php");

validacookies.php (used to verify user login)

include "abre_banco.php";
if (isset ($_SESSION["nome_usuario"])) {
   $nome_usuario=$_SESSION["nome_usuario"];
}
if (isset ($_SESSION["senha_usuario"])) {
   $senha_usuario=$_SESSION["senha_usuario"];
}
if ((empty($nome_usuario)OR empty($senha_usuario))) {
   errada();
}
else {
     $sql="SELECT * FROM login WHERE nome='$nome_usuario' and senha='$senha_usuario'";
     $res=mysql_query($sql);
     $quant=mysql_num_rows($res);
     if ($quant==0) {
        errada();
     }
}
function errada() {
   echo "<script type='text/javascript'>window.top.location='/xxx/index.php';</script>";
   exit;
}

If I want a page to be protected, I put this code at the beginning of it:

<?php

session_start();
include "valida_cookies.php";

?>
    
asked by anonymous 24.06.2015 / 16:03

2 answers

0

I rewrote your code using the PDO class for connection, See why using PDO

first step logar function:


function logar($nome, $senha) {
   $pdo = connect();
   $senha = md5($senha);
   $sql = $pdo->prepare("SELECT * FROM usuarios WHERE nome = :nome AND SENHA = :senha ");
   $sql->bindParam(":nome", $nome, PDO::PARAM_STR);
   $sql->bindParam(":senha", $senha, PDO::PARAM_STR);
   $sql->execute();
   if ($sql->rowCount() > 0) {
      while ($row = $sql->fetch()) {
         if (!empty($row['idusuario'])):
            $_SESSION['idusuario'] = $row['idusuario'];
         endif;
      }
      $resultado = true;
   } else {
      $resultado = false;
   }
   return $resultado;
}

It takes name and password, changes the password for md5 and makes a select if the user and password is equal, if yes and stored in a session the id of the user and returned true to enter the system. >

Now to validate user access use this function in a file called funcoes.php which can be called from all the pages you want to validate access to:


function validaAcesso($usuario){
   if(empty($usuario)):
      header("Location: index.php");
   endif;
}

validaAcesso($_SESSION['idusuario']);

This way if the person tries to enter a page through the url it will redirect to the login screen.

If you need to log out the idea is the same as follows:


function desconectar(){
   session_unset();
    header("Location: index.php");
}
    
24.06.2015 / 18:13
1

Come on, your code contains several problems. But I'm here to help;), first the file validacookies.php is not necessary, delete it.

I have rewritten your Scripts by putting some functions and a better logic (Not the best of all, but it will solve your problem).

File pegasenha.php :

<?php

// INICIA AS SESSÕES
session_start( );

// DEFINE O CÓDIGO COMO UTF-8
header( "Content-Type: text/html; charset=utf-8" );

// CONEXÃO COM BANCO DE DADOS
include "abre_banco.php";

/**
 *
 * Verifica se o campo informado possui um valor que precisa ser envolvido em aspas simples ou não, para poder inserir em um
 * script SQL. Além disso, escapa todos os caracteres epeciais ( aspas simples, duplas, asteriscos, etc. )
 *
 * @author Moises Gama
 * @param $string: String que será verificada
 * @param [ $not_null ]: Indica que um campo não pode ser NULL. Se for "numeric", "0" ( zero ) será adicionado, e se for "string", ''
 * @return String
 * @category Funções
 *
 **/
function format_to_sql( $string, $not_null = NULL )
{
    // SE NÃO FOR UM VALOR NULO ( NULL ), ADICIONA AS ASPAS SIMPLES
    if( $string )
    {
        $string = "'" . addslashes( $string ) . "'";
    }
    elseif( $not_null )
    {
        $string = "'" . ( ( $not_null == "numeric" ) ? "0" : "" ) . "'";
    }
    else
    {
        $string = "NULL";
    }

    return $string;
}

/**
 *
 * Verifica se a diretiva "magic_quotes_gpc" está ativa ( "on" ) no php.ini e, caso não esteja, escapa os valores especiais
 * da string com a função addslashes( ). Com essa função evitamos o escape de caracteceres especiais duas vezes.
 *
 * @author Moises Gama
 * @param $string: String que será escapada ou não
 * @return String
 * @category Funções
 *
 **/
function escape_special_chars( $string )
{
    return ( !get_magic_quotes_gpc( ) ) ? addslashes( $string ) : $string;
}

// CRIA A VARIÁVEL USUÁRIO E PREVINE CONTRA SQL INJECTION
$usuario = escape_special_chars($_POST["usuario"]);

// CRIA A VARIÁVEL SENHA E PREVINE CONTRA SQL INJECTION
$senha = escape_special_chars($_POST["senha"]);

// CRIPTOGRAFA A VARIÁVEL SENHA EM MD5
$senha = md5($senha);

// SELECT PARA VERIFICAR SE O USUÁRIO ESTÁ NO BANCO DE DADOS
$selecionar_usuario = "SELECT * FROM login WHERE usuario = " . format_to_sql( $usuario ) . " AND senha= " . format_to_sql( $senha ) . "";

// EXECUTA O SELECT 
$executar_sql = mysql_query($selecionar_usuario);
// CONTA QUAL É QUANTIDADE DE RETORNO O SELECT
$quantidade_resultados = mysql_num_rows($executar_sql);
// CRIA O FETCH ASSOC PARA O SELECT CASO QUEIRA UTILIZAR
$usuarios_cadastrados = mysql_fetch_assoc($executar_sql);

// VERIFICA SE A QUANTIDADE DE RETORNOS É IGUAL A 1 (SE O USUÁRIO ESTÁ CADASTRADO)
if( $quantidade_resultado == 1 )
{
    // CRIA A SESSÃO DE LOGIN COMO VERDADEIRA
    $_SESSION["login_valido"]   = true;
    // CRIA A SESSÃO COM O NOME DO USUÁRIO
    $_SESSION["nome_usuario"]   = $usuario;
    // CRIA A SESSÃO COM A SENHA DO USUÁRIO
    $_SESSION["senha_usuario"]  = $senha;

    // REDIRECIONA PARA PÁGINA DESEJADA
    header("Location: menu.php");
    // PARA O SCRIPT
    exit(0);
}
else 
{   
    // CASO NÃO SEJA USUÁRIO RETORNA COM A MENSAGEM DE ERRO NO LOGIN
    unset($_SESSION["login_valido"]);
    // REDIRECIONA PARA PÁGINA DESEJADA COM MENSAGEM DE ERRO (OBS. VOCÊ PRECISA DAR UM GET NAS INFORMAÇÕES E MONTAR UMA MENSAGEM)
    header("Location: index.php?msg=login-erro");
    // PARA O SCRIPT
    exit(0);
}
?>

Logout.php file :

<?php

// INICIA AS SESSÕES
session_start( );

// DEFINE O CÓDIGO COMO UTF-8
header( "Content-Type: text/html; charset=utf-8" );

// REMOVE SOMENTE A SESSION DESEJADA
unset( $_SESSION[ 'login_valido' ] );
// REMOVE TODAS AS SESSÕES
session_unset();
// DESTROI TODAS AS SESSION (VOCÊ DEVE PENSAR PARA QUE TUDO ISSO, É SOMENTE SEGURANÇA QUE ACABOU COM TUDO =] )
session_destroy();
// REDIRECIONA PARA PÁGINA DESEJADA COM MENSAGEM DE ERRO (OBS. VOCÊ PRECISA DAR UM GET NAS INFORMAÇÕES E MONTAR UMA MENSAGEM)
header("Location: index.php?msg=logout");
// PARA O SCRIPT
exit(0);
?>

How to verify user access and protect access:

<?php
    // VERIFICA SE A SESSION EXISTE, CASO NÃO ELE É REDIRECIONADO
    if( $_SESSION["login_valido"] != true )
    {
        // REMOVE A SESSION POR SEGURANÇA NOVAMENTE
        unset($_SESSION["login_valido"]);
        // REDIRECIONA PARA PÁGINA DESEJADA COM MENSAGEM DE ERRO (OBS. VOCÊ PRECISA DAR UM GET NAS INFORMAÇÕES E MONTAR UMA MENSAGEM)
        header("Location: index.php?msg=sem-permissao");
        // PARA O SCRIPT
        exit(0);
    }
?>
    
24.06.2015 / 17:29