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.

<?php
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':
			// ...
	}
}

?>
<?php
/* 
 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:

  1. Cambio de $_POST['user'] por $_SESSION['user']->user en user.php
  2. Cambio de ubicación de la comprobación de la variable user en la sesión

¿Todavía queda algún problema de seguridad?