Foros del Web » Programando para Internet » PHP »

La función login_check no funciona

Estas en el tema de La función login_check no funciona en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 07/05/2015, 02:58
 
Fecha de Ingreso: julio-2014
Mensajes: 53
Antigüedad: 9 años, 8 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
  #2 (permalink)  
Antiguo 07/05/2015, 07:14
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 15 años, 11 meses
Puntos: 2534
Respuesta: La función login_check no funciona

¿Y en qué parte de código inicias la sesión con session_start() o cómo?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 08/05/2015, 02:50
 
Fecha de Ingreso: julio-2014
Mensajes: 53
Antigüedad: 9 años, 8 meses
Puntos: 1
Respuesta: La función login_check no funciona

Tengo un archivo "login.php":

Código:
<?php
        if (isset($_GET['error'])) {
            echo '<p class="error">Error Logging In</p>';
        }
        ?> 
        <form action="includes/process_login.php" method="post" name="login_form">                      
            Nombre de usuario: <input type="text" name="username" /><br><br>
            Contraseña:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <input type="password" 
                             name="password" 
                             id="password"/><br><br>
            <input type="button" 
                   value="Iniciar sesión" 
                   onclick="formhash(this.form, this.form.password);" id="login-button"/> <br><br>
        </form>
        <p> Si ha terminado, por favor<a href="includes/logout.php"> cierra la sesión.</a></p><br>
        <p> <?php echo $logged ?> está conectado</p>

    </section>
</section>
y después un "process_login donde hay la funcion sec_session_start():

Código:
<?php
include_once 'db_connect.php';
include_once 'functions.php';
 
sec_session_start(); // Forma personalizada segura de iniciar la sessión PHP.
 
if (isset($_POST['username'], $_POST['p'])) {
    $username = $_POST['username'];
    $password = $_POST['p']; // La contraseña con hash
 
    if (login($username, $password, $mysqli) == true) {
        // Inicio de sessión exitosa
        header('Location: ../protected_page.php');
    } else {
        // Inicio de sesión errónea
        header('Location: ../login.php?error=1');
    }
} else {
    // Las variables POST correctas no se han enviado a esta página.
    echo 'Solicitud no válida';
}
Y la funcion sec_session_start:

Código:
function sec_session_start() {
    $session_name = 'sec_session_id';   // Configura un nombre de sesión personalizado.
    $httponly = true;
    if (ini_set('session.use_only_cookies', 1) === FALSE) {
        header("Location: ../error.php?err=Could not initiate a safe session (ini_set)");
        exit();
    }
    // Obtiene los paraáetros de los cookies actuales.
    $cookieParams = session_get_cookie_params();
    session_set_cookie_params($cookieParams["lifetime"],
        $cookieParams["path"], 
        $cookieParams["domain"], 
        $httponly);
    // Configura el nombre de sesión al configurado arriba.
    session_name($session_name);
    session_start();            // Inicia la sesión PHP.
    session_regenerate_id();    // Regenera la sesión, borra la previa. 
}

Última edición por alfuco; 11/05/2015 a las 01:14 Razón: I'm fucking Zeeeez braah
  #4 (permalink)  
Antiguo 11/05/2015, 01:16
 
Fecha de Ingreso: julio-2014
Mensajes: 53
Antigüedad: 9 años, 8 meses
Puntos: 1
Respuesta: La función login_check no funciona

A nadie se le ocurre alguna idea?
  #5 (permalink)  
Antiguo 21/05/2015, 02:42
 
Fecha de Ingreso: julio-2014
Mensajes: 53
Antigüedad: 9 años, 8 meses
Puntos: 1
Respuesta: La función login_check no funciona

He estado días mirando el código y me es imposible encontrar el error... Por favor, alguien podría mirarlo?

Gracias
  #6 (permalink)  
Antiguo 21/05/2015, 04:43
Avatar de Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 12 años, 10 meses
Puntos: 261
Respuesta: La función login_check no funciona

¿Que valor contiene $password?
Código PHP:
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); // <--------- $password ¿que valor trae?
                
$stmt->fetch();
                
$login_check hash('sha512'$password $user_browser);
                
//... 
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight

Etiquetas: html, mysql, registro, select, sql, usuarios, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:41.