A partir de ahora, cada semana haré el intento de poner los quiz los días lunes o martes, así tendremos más tiempo para comentar estos pequeños ejercicios.
Esta vez, se trata de dos páginas: la primera que se encarga de realizar el login de los usuarios y la segunda se encarga de mostrar y actualizar el perfil del usuario que accede a la página.
session_start();
/*
session.php:
Se encarga de validar los datos del usuario y
que exista una sesión válida para acceder a user.php
*/
include_once './config.php';
include_once './db.php';
if ( !empty($_REQUEST['action']) ) {
switch ($_REQUEST['action']) {
case 'login':
if ( !empty($_SESSION['user']) ) {
header('Location: http://sitio/user.php');
exit();
}
$username = $db->escape($_POST['user']);
$pass = md5($secret_key . $_POST['password']);
if ( $user = $db->get_row("SELECT * FROM users WHERE user='$username' AND password='$pass'") ) {
session_regenerate_id();
$_SESSION['user'] = $user;
header('Location: http://sitio/user.php');
exit();
}
die('Usuario no válido');
case 'logout':
// ...
}
}
?>
/*
user.php:
Se encarga de mostrar y actualizar el perfil de un usuario
*/
include_once './session.php';
if ( empty($_SESSION['user']) ) {
header('Location: http://sitio/session.php');
exit();
}
if ( !empty($_REQUEST['action']) ) {
switch ($_REQUEST['action']) {
case 'update-profile':
// Limpiar los datos
$_POST['name'] = htmlspecialchars(strip_tags($_POST['name']), ENT_QUOTES, 'utf-8');
$_POST['email'] = preg_replace('/[^a-z0-9.@-]/i', '', $_POST['email']);
// Escapar los valores
$user = $db->escape($_SESSION['user']->user);
$name = $db->escape($_POST['name']);
$email = $db->escape($_POST['email']);
$password = md5($secret_key . $_POST['password']);
$sql = "UPDATE users SET name = '%s', email = '%s', password = '%s' WHERE user = '%s'";
$db->query(sprintf($sql, $name, $email, $password, $user));
break;
case 'recover-password':
// ...
}
}
?>
¿Existe algún bug en el código mostrado?
Actualización:
- Cambio de
$_POST['user']
por$_SESSION['user']->user
en user.php - Cambio de ubicación de la comprobación de la variable
user
en la sesión
¿Todavía queda algún problema de seguridad?