0Pricing
PHP Academy · Lección

Saneamiento de entradas de usuario

Elimine caracteres peligrosos con htmlspecialchars y filter_input.

Saneamiento de entradas de usuario es una lección gratuita de PHP Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de PHP Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de PHP Academy incluye 4 lecciones en total.

Sanitización frente a validación

La validación comprueba si los datos cumplen los requisitos (y los rechaza si no los cumplen).
La sanitización limpia los datos eliminando o codificando caracteres peligrosos para que sea seguro utilizarlos.

Ambas son necesarias: valide primero y, después, sanitice los datos antes de mostrarlos.

htmlspecialchars() para mostrar HTML

Escape siempre la salida antes de insertarla en HTML para evitar XSS:

<?php
$name = '<script>alert(1)</script>';

// Dangerous — executes script:
// echo $name;

// Safe:
echo htmlspecialchars($name, ENT_QUOTES | ENT_HTML5, 'UTF-8');
// &lt;script&gt;alert(1)&lt;/script&gt;

htmlentities() frente a htmlspecialchars()

Ambas funciones escapan HTML, pero htmlentities convierte TODOS los caracteres aplicables; htmlspecialchars solo convierte los cinco más peligrosos:

<?php
$str = '<b>caf&eacute;</b> & "bar"';

// htmlspecialchars: only & < > ' "
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8');

// htmlentities: also converts é → &eacute;
echo htmlentities($str, ENT_QUOTES, 'UTF-8');
// Prefer htmlspecialchars — htmlentities can break UTF-8

filter_var FILTER_SANITIZE_*

Los modos de sanitización de filter_var eliminan contenido peligroso:

<?php
$rawEmail = 'user(bad)@exam<ple.com';
$clean = filter_var($rawEmail, FILTER_SANITIZE_EMAIL);
echo $clean; // user@example.com

$rawUrl = 'http://exa mple.com/pa th?q=foo bar';
$cleanUrl = filter_var($rawUrl, FILTER_SANITIZE_URL);
echo $cleanUrl;

strip_tags()

Elimine las etiquetas HTML de una cadena y, opcionalmente, conserve las etiquetas permitidas:

<?php
$input = '<p>Hello <b>World</b> <script>alert(1)</script></p>';

// Remove all tags:
echo strip_tags($input);
// Hello World alert(1)

// Keep only <b> and <i>:
echo strip_tags($input, '<b><i>');
// Hello <b>World</b>

Sanitización para SQL

Nunca sanitice SQL con funciones para cadenas; use siempre sentencias preparadas. El enfoque correcto es:

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');

// WRONG — even with addslashes this is dangerous:
// $sql = "SELECT * FROM users WHERE email = '" . addslashes($email) . "'";

// CORRECT — prepared statement:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);
$user = $stmt->fetch();

addslashes() frente a sentencias preparadas

addslashes() escapa las barras invertidas y las comillas, pero NO es seguro para SQL. Use sentencias preparadas de PDO. addslashes() aún puede resultar útil para fines distintos de SQL, como generar cadenas de JavaScript:

<?php
// For embedding PHP string into JavaScript (still escape via json_encode):
$jsData = json_encode(['name' => $userInput], JSON_HEX_QUOT);
echo "<script>var data = $jsData;</script>";

Sanitización de nombres de archivo

Elimine los caracteres peligrosos de los nombres de archivos cargados:

<?php
function sanitizeFilename(string $name): string {
    // Remove path traversal chars and other dangerous ones
    $name = basename($name);                          // strip any path
    $name = preg_replace('/[^a-zA-Z0-9._-]/', '_', $name); // only safe chars
    $name = preg_replace('/_{2,}/', '_', $name);      // collapse underscores
    return strtolower($name);
}

echo sanitizeFilename('../../../etc/passwd');   // etc_passwd
echo sanitizeFilename('My Photo (1).JPG');      // my_photo_1_.jpg

Conversión a entero para identificadores

La sanitización más sencilla para identificadores numéricos: conviértalos a int, lo que descarta cualquier contenido no numérico:

<?php
// Never do this:
$id = $_GET['id'];
$sql = "SELECT * FROM posts WHERE id = $id";

// Safe approach 1: cast to int
$id = (int) ($_GET['id'] ?? 0);
if ($id <= 0) die('Invalid ID');

// Safe approach 2: validate
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if (!$id) die('Invalid ID');

El contexto de salida es importante

Cada contexto de salida necesita un escape diferente:

  • Cuerpo HTML → htmlspecialchars()
  • Atributo HTML → htmlspecialchars(ENT_QUOTES)
  • JSON/JavaScript → json_encode()
  • Parámetro de URL → urlencode()
  • SQL → sentencias preparadas

urlencode y rawurlencode

Codifique los valores para utilizarlos en URL:

<?php
$search = 'hello world & PHP';

echo urlencode($search);
// hello+world+%26+PHP  (+ for spaces)

echo rawurlencode($search);
// hello%20world%20%26%20PHP  (RFC 3986 — use in paths)

$url = 'https://example.com/search?q=' . urlencode($search);
echo $url;

Comprobación rápida

¿Qué función es la forma correcta de evitar la inyección SQL al usar datos del usuario en una consulta de base de datos?

Resumen: Sanitización de entradas

Reglas de sanitización:

  • Salida HTML → htmlspecialchars(ENT_QUOTES, 'UTF-8')
  • SQL → sentencias preparadas, nunca escapes de cadenas
  • URL → urlencode() o rawurlencode()
  • Nombres de archivo → elimine caracteres con expresiones regulares y use basename()
  • Identificadores enteros → conviértalos con (int)
  • Etiquetas → use strip_tags() para filtrar las etiquetas permitidas

Preguntas frecuentes

¿La lección «Saneamiento de entradas de usuario» es gratis?

Sí — el texto completo de «Saneamiento de entradas de usuario» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de PHP Academy, actualiza a CoddyKit PRO. El curso de PHP Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Saneamiento de entradas de usuario»?

Elimine caracteres peligrosos con htmlspecialchars y filter_input. Practicas PHP Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar PHP Academy?

No se requiere experiencia previa. PHP Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Saneamiento de entradas de usuario»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de PHP Academy?

Sí. Cada lección de PHP Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. GET frente a POST: cuándo usar cada uno
  2. Lectura de datos de formularios con superglobales
  3. Técnicas de validación de entradas
  4. Saneamiento de entradas de usuario
← Volver a PHP Academy