SANITIZACIÓN DE DATOS

La sanitización de datos es el proceso de validar, filtrar y limpiar toda la información que entra en tu sistema para garantizar que sea segura, consistente y de confianza antes de almacenarla o procesarla. La sanitización de datos no solo protege una aplicación sino que también protege a los usuarios y al negocio.

¿Por qué es tan importante?

  • Previene errores en los datos
  • Evita ataques de inyección como XSS o SQL Injection
  • Mejora la calidad de la información
  • Aumenta la confianza en los sistemas
  • Cumple con buenas prácticas y normativas de seguridad

Técnicas comunes

  • Validación de tipos y formatos
  • Eliminación de caracteres peligrosos
  • Escape de caracteres especiales
  • Límites de longitud
  • Normalización de datos
  • Uso de consultas preparadas

Buenas prácticas

  • Nunca confíes en los datos del usuario
  • Valida tanto en cliente como en servidor
  • Usa librerías y frameworks actualizados
  • Aplica el principio de mínimo privilegio
  • Registra y monitoriza entradas sospechosas

Ejemplos

Sanitización contra XSS

Ejemplo en javascript:

const limpio = entrada
    .replace(/&/g, "&")
    .replace(//g, ">")
    .replace(/"/g, """)
    .replace(/'/g, "'");

Sanitización contra SQL Injection

//ENTRADA MALICIOSA
' OR '1'='1

//USANDO CONSULTAS PREPARADAS (la mejor forma)
$stmt = $pdo->prepare("SELECT * FROM usuarios WHERE email = ?");
$stmt->execute([$email_sanitizado]);

//No hacer nunca
"SELECT * FROM usuarios WHERE id = " . $id;  // PELIGROSO

Sanitización de Email

function sanitizar_email($email) {
    // Limpiar espacios y convertir a minúsculas
    $email = trim(strtolower($email));
    
    // Patrón básico de validación de email
    if (preg_match('/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', $email)) {
   return $email;
    }
    
    return null; // email inválido
}

Sanitización de Nombres de Archivos (para subir archivos)

//Entrada: ../../../etc/passwd.jpg
//Salida: etc_passwd.jpg

function sanitizar_nombre_archivo($nombre) {
    // Mantener solo letras, números, guiones, puntos y espacios
    $nombre = preg_replace('/[^\w\s.-]/u', '', $nombre);
    
    // Reemplazar uno o más espacios por guion bajo
    $nombre = preg_replace('/[\s]+/', '_', $nombre);
    
    // Limitar la longitud máxima a 100 caracteres
    return substr($nombre, 0, 100);
}

Sanitización de URL / Parámetros

//Javascript
function sanitizarUrlParametro(param) {
    return encodeURIComponent(param.trim());
}

// Uso
const busqueda = sanitizarUrlParametro("datos maliciosos & hack=1");

Recomendación

La mejor práctica es combinar varias capas:
  • Validación en el frontend
  • Sanitización + Validación estricta en el backend
  • Uso de librerías especializadas:
      PHP: htmlspecialchars(), filter_var() Node.js: DOMPurify, validator.js Python: bleach, html.escape()