Cómo se usa
Esta página cubre todo lo de la lección 8: permisos por rol, contraseñas, inyección SQL, XSS y CSRF.
Hay 9 preguntas y 3 ejercicios, con corrección inmediata.
Preguntas
Todavía sin contestar · 9 preguntas
Roles y contraseñas
1. ¿Dónde se comprueba que el usuario tiene permiso para una acción?
Elegí una opción para verla
En el servidor. Esconder un botón es comodidad; cualquiera puede pedir la dirección a mano.
2. ¿Cómo se guarda una contraseña?
Elegí una opción para verla
Con el hash de password_hash() (bcrypt). Es irreversible y está pensado para ser lento.
3. ¿Por qué MD5 no sirve para contraseñas?
Elegí una opción para verla
Porque es rápido. Un algoritmo rápido es lo peor para contraseñas: acelera la fuerza bruta.
Inyección SQL y XSS
4. ¿Cuál es la defensa contra la inyección SQL?
Elegí una opción para verla
Las consultas preparadas: el valor viaja aparte del SQL y nunca se interpreta como código.
5. ¿Qué es XSS?
Elegí una opción para verla
Inyectar HTML o JavaScript que se ejecuta en el navegador de otros usuarios. Se evita escapando al mostrar.
6. ¿Con qué se escapa un dato antes de mostrarlo?
Elegí una opción para verla
htmlspecialchars() convierte los caracteres especiales en entidades y el navegador los muestra como texto, no los ejecuta.
CSRF
7. ¿Qué es un ataque CSRF?
Elegí una opción para verla
Otra página aprovecha la sesión abierta para enviar una petición en nombre del usuario.
8. ¿Cómo se previene?
Elegí una opción para verla
Con un token que solo conoce el sitio: se genera por sesión, va en un campo oculto y se compara con hash_equals().
9. ¿Por qué se compara con hash_equals() y no con ===?
Elegí una opción para verla
Porque la comparación de === puede cortar antes y filtrar cuántos caracteres coincidían (ataque de tiempos). hash_equals() tarda lo mismo siempre.
Ejercicios de práctica
Ejercicio 1
Escribí el alta de un usuario guardando la contraseña con password_hash().
$hash = password_hash($clave, PASSWORD_DEFAULT);
$alta = $pdo->prepare('INSERT INTO usuarios (usuario, clave, rol) VALUES (?, ?, ?)');
$alta->execute([$usuario, $hash, 'vendedor']);Ejercicio 2
Escribí la comprobación del login con password_verify() y una consulta preparada.
$c = $pdo->prepare('SELECT * FROM usuarios WHERE usuario = ?');
$c->execute([$usuario]);
$fila = $c->fetch();
if ($fila && password_verify($clave, $fila['clave'])) {
$_SESSION['usuario'] = $fila['usuario'];
$_SESSION['rol'] = $fila['rol'];
header('Location: panel.php');
exit;
}Ejercicio 3
Mostrá un comentario que llegó por formulario, de forma segura.
echo htmlspecialchars($comentario, ENT_QUOTES, 'UTF-8');Se escapa al mostrar, no al guardar.
Cómo saber si está bien
Si acertaste 7 o más, la lección está firme. Las tres siglas que hay que poder explicar: SQL injection, XSS y CSRF.
Lo que hay que poder explicar
- Los permisos se comprueban en el servidor.
- Contraseñas con
password_hash/password_verify. - Consultas preparadas contra inyección SQL.
htmlspecialcharscontra XSS.- Token con
hash_equalscontra CSRF.
Licencia. El material de esta página es elaboración propia de Prof Mauro Bobyk —a partir de las fuentes que detalla el pie del sitio— y se publica bajo una licencia Creative Commons BY-NC-SA 4.0.