Ver Mensaje Individual
  #1 (permalink)  
Antiguo 07/05/2015, 02:58
alfuco
 
Fecha de Ingreso: julio-2014
Mensajes: 53
Antigüedad: 9 años, 9 meses
Puntos: 1
La función login_check no funciona

Buenos días, estoy intentando hacer una "zona privada" para un proyecto personal con código que no es mío ya que no tengo los conocimientos suficientes como para hacerlo. Sin embargo, soy capaz de entenderlo. Tengo las páginas de registro que funcionan bien, la de login que también lo hace bien pero la que confirma que estés "logueado" no funciona correctamente y entonces no se muestra esa página privada.

Os pongo el código de la página protegida:

Código:
<?php
include_once 'includes/db_connect.php';
include_once 'includes/functions.php';
 
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Inicio de sesión segura: Página protegida</title>
        <link rel="stylesheet" href="styles/main.css" />
    </head>
    <body>
        <?php if (login_check($mysqli) == true) : ?>
            <p>¡Bienvenido, <?php echo htmlentities($_SESSION['username']); ?>!</p>
            <p>
                Este es un ejemplo de página protegida. Para acceder a esta página, los usuarios
                deberán iniciar su sesión.  En algún momento, también verificaremos el rol 
                del usuario para que las páginas puedan determinar el tipo de usuario 
                autorizado para acceder a la página.
            </p>
            <p>Regresar a la<a href="index.php">página de inicio de sesión.</a></p>
        <?php else : ?>
            <p>
                <span class="error">No está autorizado para acceder a esta página.</span> Please <a href="index.php">login</a>.
            </p>
        <?php endif; ?>
    </body>
</html>

Aquí la función "login"

Código:
function login($username, $password, $mysqli) {
    if ($stmt = $mysqli->prepare("SELECT id, nombre_empresa, password, salt 
        FROM clientes WHERE username = ?
        LIMIT 1")) {
        $stmt->bind_param('s', $username);  // Une “$username” al parámetro.
        $stmt->execute();    // Ejecuta la consulta preparada.
        $stmt->store_result();
 
        // Obtiene las variables del resultado.
        $stmt->bind_result($user_id, $nombre_empresa, $db_password, $salt);
        $stmt->fetch();
 
        // Hace el hash de la contraseña con una sal única.
        $password = hash('sha512', $password . $salt);
        if ($stmt->num_rows == 1) {
            // Si el usuario existe, revisa si la cuenta está bloqueada
            // por muchos intentos de conexión.
 
            if (checkbrute($user_id, $mysqli) == true) {
                // Cuenta bloqueada.
                // Envía un correo electrónico al usuario que le informa que su cuenta está bloqueada.
                return false;
            } else {
                // Revisa que la contraseña en la base de datos coincida 
                // con la contraseña que el usuario envió.
                if ($db_password == $password) {
                    // Contraseña correcta!
                    // Obtiene el agente de usuario del usuario.
                    $user_browser = $_SERVER['HTTP_USER_AGENT'];
                    //  Protección XSS ya que se puede imprimir este valor.
                    $user_id = preg_replace("/[^0-9]+/", "", $user_id);
                    $_SESSION['user_id'] = $user_id;
                    //  Protección XSS ya que se puede imprimir este valor.
                    $username = preg_replace("/[^a-zA-Z0-9_\-]+/", "", $username);
                    $_SESSION['username'] = $username;
                    $_SESSION['login_string'] = hash('sha512', $password . $user_browser);                    
                    // Inicio de sesión correcto
                    return true;
                } else {
                    // La contraseña no es correcta.
                    // Se introduce este intento en la base de datos.
                    $now = time();
                    $mysqli->query("INSERT INTO login_attempts (user_id, time) VALUES ('$user_id', '$now')");
                    return false;
                }
            }
        } else {
            // El usuario no existe.
            return false;
        }
    }
}

Y aquí la función "login_check"

Código:
function login_check($mysqli) {
    // Revisa si todas las variables de sesión están configuradas.
    if (isset($_SESSION['user_id'], 
                        $_SESSION['username'], 
                        $_SESSION['login_string'])) {
 
        $user_id = $_SESSION['user_id'];
        $login_string = $_SESSION['login_string'];
        $username = $_SESSION['username'];
 
        // Obtiene la cadena de agente de usuario del usuario.
        $user_browser = $_SERVER['HTTP_USER_AGENT'];
 
        if ($stmt = $mysqli->prepare("SELECT password FROM clientes WHERE username = ? LIMIT 1")) {
            // Uneix “$user_id” al paràmetre.
            $stmt->bind_param('s', $username);
            $stmt->execute();   // Ejecuta la consulta preparada.
            $stmt->store_result();
 
            if ($stmt->num_rows == 1) {
                // Si el usuario existe, obtiene las variables del resultado.
                $stmt->bind_result($password);
                $stmt->fetch();
                $login_check = hash('sha512', $password . $user_browser);
 
                if ($login_check == $login_string) {
                    // Conectado 
                    return true;
                } else {
                    // No conectado.
                    return false;
                }
            } else {
                // No conectado.
                return false;
            }
        } else {
            // No conectado.
            return false;
        }
    } else {
        // No conectado.
        return false;
    }
}
He hecho algunas pruebas como por ejemplo quitar el último "return" de la función login_check. Entonces, sí me funciona y entra en la página protegida pero la frase inicial
Código:
<p>¡Bienvenido, <?php echo htmlentities($_SESSION['username']); ?>!</p>
queda: ¡Bienvenido, !
Así que creo que podría ser un problema de que no guarda las variables de inicio de sesión. A ver si alguien tiene alguna idea y puede ayudarme.

Muchísimas gracias de antemano