Leccion 62 de 75 10 min de lectura

Validación de Datos

Validar datos es fundamental para la seguridad y estabilidad de tu aplicacion. PHP incluye funciones de filtrado que facilitan validar emails, URLs, numeros y sanear texto.

¿Por qué validar?

Nunca confies en los datos que vienen del usuario. Pueden contener errores accidentales o intentos de ataque. La validacion verifica que los datos tienen el formato correcto.

filter_var para validar

filter_var() es la forma mas simple de validar datos comunes:

PHP
<?php

declare(strict_types=1);

// Validar email
$email = 'usuario@ejemplo.com';

if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo 'Email valido';
} else {
    echo 'Email invalido';
}

// Validar URL
$url = 'https://ejemplo.com';

if (filter_var($url, FILTER_VALIDATE_URL)) {
    echo 'URL valida';
}

// Validar entero
$edad = '25';

if (filter_var($edad, FILTER_VALIDATE_INT) !== false) {
    echo 'Numero valido';
}

Filtros de validación comunes

PHP
<?php

declare(strict_types=1);

// FILTER_VALIDATE_EMAIL - Email
filter_var('test@mail.com', FILTER_VALIDATE_EMAIL); // 'test@mail.com'
filter_var('invalido', FILTER_VALIDATE_EMAIL);      // false

// FILTER_VALIDATE_URL - URL
filter_var('https://php.net', FILTER_VALIDATE_URL); // 'https://php.net'

// FILTER_VALIDATE_INT - Entero
filter_var('42', FILTER_VALIDATE_INT);   // 42
filter_var('3.14', FILTER_VALIDATE_INT); // false

// FILTER_VALIDATE_FLOAT - Decimal
filter_var('3.14', FILTER_VALIDATE_FLOAT); // 3.14

// FILTER_VALIDATE_BOOLEAN - Booleano
filter_var('true', FILTER_VALIDATE_BOOLEAN);  // true
filter_var('yes', FILTER_VALIDATE_BOOLEAN);   // true
filter_var('1', FILTER_VALIDATE_BOOLEAN);     // true
filter_var('false', FILTER_VALIDATE_BOOLEAN); // false

// FILTER_VALIDATE_IP - Direccion IP
filter_var('192.168.1.1', FILTER_VALIDATE_IP); // '192.168.1.1'

Validar con opciones

PHP
<?php

declare(strict_types=1);

// Validar entero en un rango
$opciones = [
    'options' => [
        'min_range' => 1,
        'max_range' => 100,
    ],
];

$edad = 25;
if (filter_var($edad, FILTER_VALIDATE_INT, $opciones) !== false) {
    echo 'Edad entre 1 y 100';
}

// Validar entero mayor que cero
$cantidad = 5;
$opciones = ['options' => ['min_range' => 1]];

if (filter_var($cantidad, FILTER_VALIDATE_INT, $opciones) !== false) {
    echo 'Cantidad valida';
}

Sanear datos

Sanear (sanitize) significa limpiar los datos, eliminando caracteres no deseados:

PHP
<?php

declare(strict_types=1);

// Eliminar etiquetas HTML
$texto = '<script>alert("hack")</script>Hola';
$limpio = filter_var($texto, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
echo $limpio; // &lt;script&gt;...Hola

// Limpiar email (quita caracteres invalidos)
$email = 'usuario  @ejemplo.com';
$limpio = filter_var($email, FILTER_SANITIZE_EMAIL);
echo $limpio; // usuario@ejemplo.com

// Limpiar URL
$url = 'https://ejemplo.com/pagina con espacios';
$limpio = filter_var($url, FILTER_SANITIZE_URL);
echo $limpio; // https://ejemplo.com/paginaconespacios

// Limpiar numero
$numero = '42abc';
$limpio = filter_var($numero, FILTER_SANITIZE_NUMBER_INT);
echo $limpio; // 42

htmlspecialchars para mostrar texto

Cuando muestras texto del usuario en HTML, usa htmlspecialchars() para prevenir XSS:

PHP
<?php

declare(strict_types=1);

$comentario = '<script>alert("XSS")</script>';

// NUNCA hagas esto:
// echo $comentario;

// SIEMPRE escapar:
echo htmlspecialchars($comentario, ENT_QUOTES, 'UTF-8');
// Muestra: &lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;

// Funcion helper comun
function escape(string $texto): string
{
    return htmlspecialchars($texto, ENT_QUOTES, 'UTF-8');
}

echo escape($comentario);

Validar formulario completo

PHP
<?php

declare(strict_types=1);

function validarRegistro(array $datos): array
{
    $errores = [];

    // Validar nombre
    $nombre = trim($datos['nombre'] ?? '');
    if ($nombre === '') {
        $errores['nombre'] = 'El nombre es obligatorio';
    } elseif (strlen($nombre) < 2) {
        $errores['nombre'] = 'El nombre es muy corto';
    }

    // Validar email
    $email = trim($datos['email'] ?? '');
    if ($email === '') {
        $errores['email'] = 'El email es obligatorio';
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errores['email'] = 'El email no es valido';
    }

    // Validar edad
    $edad = $datos['edad'] ?? '';
    $opciones = ['options' => ['min_range' => 18, 'max_range' => 120]];
    if (filter_var($edad, FILTER_VALIDATE_INT, $opciones) === false) {
        $errores['edad'] = 'La edad debe ser entre 18 y 120';
    }

    return $errores;
}

// Uso
$datos = [
    'nombre' => 'Ana',
    'email' => 'ana@ejemplo.com',
    'edad' => '25',
];

$errores = validarRegistro($datos);

if (empty($errores)) {
    echo 'Datos validos';
} else {
    foreach ($errores as $campo => $mensaje) {
        echo "$campo: $mensaje" . PHP_EOL;
    }
}

Funciones de validacion propias

PHP
<?php

declare(strict_types=1);

function esEmailValido(string $email): bool
{
    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}

function esTelefonoValido(string $telefono): bool
{
    // Telefono español: 9 digitos, empieza por 6, 7 o 9
    return preg_match('/^[679]\d{8}$/', $telefono) === 1;
}

function esPasswordSeguro(string $password): bool
{
    // Minimo 8 caracteres, 1 mayuscula, 1 minuscula, 1 numero
    return strlen($password) >= 8
        && preg_match('/[A-Z]/', $password)
        && preg_match('/[a-z]/', $password)
        && preg_match('/[0-9]/', $password);
}

// Uso
var_dump(esEmailValido('test@mail.com'));    // true
var_dump(esTelefonoValido('612345678'));     // true
var_dump(esPasswordSeguro('Abc12345'));      // true

Ejercicios

Ejercicio 1: Validar email

Crea una funcion validarEmail(string $email): bool que verifique si un email es valido usando filter_var().

Ver solucion
PHP
<?php

declare(strict_types=1);

function validarEmail(string $email): bool
{
    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}

var_dump(validarEmail('usuario@mail.com')); // true
var_dump(validarEmail('invalido'));         // false

Ejercicio 2: Validar edad

Crea una funcion validarEdad(mixed $edad): bool que verifique si la edad es un numero entre 0 y 150.

Ver solucion
PHP
<?php

declare(strict_types=1);

function validarEdad(mixed $edad): bool
{
    $opciones = [
        'options' => [
            'min_range' => 0,
            'max_range' => 150,
        ],
    ];

    return filter_var($edad, FILTER_VALIDATE_INT, $opciones) !== false;
}

var_dump(validarEdad(25));  // true
var_dump(validarEdad(200)); // false
var_dump(validarEdad('abc')); // false

Ejercicio 3: Limpiar texto

Crea una funcion limpiarTexto(string $texto): string que elimine etiquetas HTML y espacios extras.

Ver solucion
PHP
<?php

declare(strict_types=1);

function limpiarTexto(string $texto): string
{
    // Eliminar etiquetas HTML
    $limpio = strip_tags($texto);

    // Eliminar espacios extras
    $limpio = preg_replace('/\s+/', ' ', $limpio);

    return trim($limpio);
}

$texto = '<b>Hola</b>    mundo   ';
echo limpiarTexto($texto); // 'Hola mundo'

¿Te está gustando el curso?

Tenemos cursos premium con proyectos reales y soporte personalizado.

Descubrir cursos premium