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:
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 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; } }
Código:
queda: ¡Bienvenido, !<p>¡Bienvenido, <?php echo htmlentities($_SESSION['username']); ?>!</p>
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