Volver
Ctrl+Space
◑
Copiar
Descargar
Restaurar
Ejecutar
Ctrl+Enter
<?php // Formularios en PHP - Ejemplo 4: Caso completo // =============================================== // Flujo completo: recibir → limpiar → validar → sanitizar → procesar. // Simulamos tres escenarios distintos para ver el comportamiento completo. function procesarRegistro(array $datos): void { // ── 1. Limpiar ────────────────────────────────────────────── // Con metodo POST $nombre = trim($datos["nombre"] ?? ""); $email = trim(strtolower($datos["email"] ?? "")); $edad = (int)trim($datos["edad"] ?? "0"); $password = $datos["password"] ?? ""; $confirmar = $datos["confirmar"] ?? ""; echo "--- Datos recibidos ---<br>"; echo "Nombre : '{$datos['nombre']}'<br>"; echo "Email : '{$datos['email']}'<br>"; echo "Edad : '{$datos['edad']}'<br>"; echo "Password : " . str_repeat("*", strlen($password)) . "<br><br>"; echo "--- Después de limpiar ---<br>"; echo "Nombre : '$nombre'<br>"; echo "Email : '$email'<br>"; echo "Edad : $edad (convertido a int)<br><br>"; // ── 2. Validar ────────────────────────────────────────────── $errores = []; if (strlen($nombre) < 2 || strlen($nombre) > 100) { $errores[] = "Nombre: debe tener entre 2 y 100 caracteres"; } if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errores[] = "Email: formato inválido"; } if ($edad < 13 || $edad > 120) { $errores[] = "Edad: debe estar entre 13 y 120"; } if (strlen($password) < 6) { $errores[] = "Password: mínimo 6 caracteres"; } if ($password !== $confirmar) { $errores[] = "Password: las contraseñas no coinciden"; } echo "--- Validación ---<br>"; if (!empty($errores)) { foreach ($errores as $e) { echo " ✗ $e<br>"; } echo "<br>"; return; // detenemos sin procesar } echo " ✓ Sin errores<br><br>"; // ── 3. Sanitizar ──────────────────────────────────────────── // htmlspecialchars convierte <script> en <script> — previene XSS $nombre_seguro = htmlspecialchars($nombre, ENT_QUOTES, "UTF-8"); $email_seguro = htmlspecialchars($email, ENT_QUOTES, "UTF-8"); // Hashear la contraseña — nunca guardar en texto plano $hash = password_hash($password, PASSWORD_BCRYPT, ["cost" => 10]); echo "--- Resultado final ---<br>"; echo "Nombre (seguro) : $nombre_seguro<br>"; echo "Email : $email_seguro<br>"; echo "Edad : $edad<br>"; echo "Hash password : " . substr($hash, 0, 28) . "...<br>"; echo "✓ Listo para guardar en la base de datos<br><br>"; // Verificar hash (como lo haría el login después) echo "--- Verificación del hash ---<br>"; $correcto = password_verify($password, $hash) ? "✓ correcto" : "✗ incorrecto"; $incorrecto = password_verify("otrapass", $hash) ? "✓ correcto" : "✗ incorrecto"; echo " password original → $correcto<br>"; echo " 'otrapass' → $incorrecto<br>"; } // ── Escenario 1: datos válidos con XSS en el nombre ───────────────────── echo "========================================<br>"; echo "ESCENARIO 1 — Datos válidos (con XSS)<br>"; echo "========================================<br>"; procesarRegistro([ "nombre" => " <script>alert('xss')</script>Juan ", "email" => "JUAN@MAIL.COM", "edad" => "28", "password" => "segura123", "confirmar"=> "segura123", ]); // ── Escenario 2: datos con errores ─────────────────────────────────────── echo "========================================<br>"; echo "ESCENARIO 2 — Datos con errores<br>"; echo "========================================<br>"; procesarRegistro([ "nombre" => "A", "email" => "no-es-email", "edad" => "10", "password" => "123", "confirmar"=> "456", ]); // ── Escenario 3: passwords distintas ───────────────────────────────────── echo "========================================<br>"; echo "ESCENARIO 3 — Passwords no coinciden<br>"; echo "========================================<br>"; procesarRegistro([ "nombre" => "María López", "email" => "maria@mail.com", "edad" => "25", "password" => "mipass123", "confirmar"=> "mipass124", ]); ?>