Carrito de compras PHP
Aplicaciones Web/Sistemas Web
Juan Pavón Mestras
Dep. Ingeniería del Software e Inteligencia Artificial
Facultad de Informática
Universidad Complutense Madrid
Material bajo licencia Creative Commons
Ejemplo de tienda
Temas a tratar
Autenticación y control de sesión
Carrito de la compra
Medios de pago
Juan Pavón - UCM 2012-13PHP
2
Login
Para identificar los usuarios se guarda el password codificado
Los algoritmos de hashing como SHA o MD5, pueden ser crackeados
• Pero para la práctica pueden valer
Hay algoritmos más sofisticados: bcrypt encryption o sha-256/512 con
refuerzo de claves (key stretching)
• Se puede encontrar en http://blackbe.lt/php-secure-sessions/
Juan Pavón - UCM2012-13
PHP
3
Página de login
Usuario y contraseña
Cliente:
Contraseña:
Entrar
Juan Pavón - UCM 2012-13
PHP
4
Variables de sesión
Una sesión tiene las variables que determinan un contexto.
En este ejemplo:
login: true
usuario: id del usuario en la BD
nombre: nombre del usuario en la BD
carrito: asignado al usuarioPara saber si una sesión está activa
if ( isset($_SESSION["login"]) )
Al acabar la sesión (logout) se eliminarán todas las variables de
sesión
Se produce al hacer
session_destroy();
También se pueden eliminar todas con
unset($_SESSION);
• Esto puede ser útil en algunos casos para reiniciar la sesión
Juan Pavón - UCM 2012-13
PHP
5
Página de proceso de loginif ($_SERVER['REQUEST_METHOD'] == 'POST') {
$uname = limpia_sql(htmlspecialchars($_POST['usuario']));
$pword = limpia_sql(htmlspecialchars($_POST['password']));
// Conexión a la BD tienda
$bd = conectaBD();
// Comprueba si el registro (usuario,password) está en la BD:
$query = "SELECT * FROM passwords WHERE usuario = $uname AND password =md5($pword)";
$resultado = $bd‐>query($query);$numregistros = $resultado‐>num_rows;
if ($resultado) {
if ($numregistros == 1) {
// El registro del usuario y password en la BD
$_SESSION["login"] = true;
$_SESSION["usuario"] = $uname;
// Mira en la BD cual es el nombre del usuario que se ha logeado
$resultado‐>free();
$query = "SELECT * FROM clientes WHERE nif = $uname";
$resultado = $bd‐>query($query);$registro = $resultado‐>fetch_assoc();
$_SESSION["nombreusuario"] = $registro["nombre"];
// Crea un carrito para este usuario en la sesión
$_SESSION["carrito"] = new carrito($usuario);
}
}
$bd‐>close();
} ?>
PHP
Juan Pavón - UCM 2012-13
6
Ataques de inyección SQL
Es importante preparar la entrada cuando se vaya a utilizar para
acceder a la BD
Por ejemplo (del manual de PHPhttp://www.php.net/manual/es/function.mysql-real-escape-string.php)
Juan Pavón - UCM 2012-13
PHP
9
Registro
Datos de nuevo cliente
NIF:
Nombre:
Dirección:
Email:
Teléfono:
Contraseña:
Registrarse
Juan Pavón - UCM 2012-13
PHP
10
Página de proceso de registro
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$uname= limpia_sql(htmlspecialchars($_POST['nif']));
$pword = limpia_sql(htmlspecialchars($_POST['password']));
$pLength = strlen($pword);
if ($pLength >= 8 && $pLength query($query);
$numregistros = $resultado‐>num_rows;
if ($numregistros == 1) { // Ya existe un usuario con ese uname (nif)
$error = $error . "Ya existe este usuario";
}
else { // Se procede a registrar el usuario
// 1) En la tabla de clientes
$query= "INSERT INTO clientes (nif, nombre, direccion, email, telefono)
VALUES ($uname, $nombre, $direccion, $email, $telefono)";
$resultado = $bd‐>query($query);
// 2) En la tabla de passwords
$pword = md5($pword);
// El password se guardará codificado
$query = "INSERT INTO passwords (usuario, password, fecha) VALUES ($uname,
'$pword', CURRENT_TIMESTAMP)";
$resultado = $bd‐>query($query)...
Regístrate para leer el documento completo.