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


