W3docs

htmlspecialchars()

La función htmlspecialchars() convierte caracteres especiales en sus entidades HTML correspondientes para prevenir ataques XSS en PHP.

La función htmlspecialchars() convierte los pocos caracteres que tienen un significado especial en HTML a sus entidades HTML correspondientes. Su principal función es la seguridad: cuando se muestran datos proporcionados por el usuario en una página web, pasarlos previamente por htmlspecialchars() evita que esos datos sean interpretados como marcado o código — la defensa estándar contra ataques de secuencias de comandos entre sitios (XSS).

Esta página cubre la sintaxis de la función, cada uno de sus parámetros con ejemplos ejecutables, los cinco caracteres que afecta, cómo difiere de funciones relacionadas y cómo revertirla de forma segura.

Sintaxis

htmlspecialchars(
    string $string,
    int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401,
    ?string $encoding = null,
    bool $double_encode = true
): string

La función recibe un parámetro obligatorio, $string — la cadena a convertir — y tres parámetros opcionales: $flags, $encoding y $double_encode. Devuelve la cadena convertida.

Nota sobre el indicador predeterminado. A partir de PHP 8.1, el valor predeterminado de $flags es ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, que codifica tanto las comillas simples como las dobles. En PHP 8.0 y versiones anteriores, el valor predeterminado era ENT_COMPAT, que dejaba las comillas simples sin modificar. Si se trabaja con versiones anteriores, siempre se debe pasar ENT_QUOTES explícitamente para que el comportamiento sea predecible.

Qué caracteres se convierten

Solo cinco caracteres se ven afectados. Todo lo demás pasa sin cambios:

CarácterEntidad (con ENT_QUOTES)
& (ampersand)&
" (comilla doble)"
' (comilla simple)'
< (menor que)&lt;
> (mayor que)&gt;

Si también se necesita codificar letras acentuadas, símbolos y otros caracteres no ASCII, se debe usar htmlentities() en su lugar.

Ejemplo básico

php— editable, runs on the server

Salida:

Hello &lt;strong&gt;World&lt;/strong&gt;!

Las etiquetas <strong> se han convertido a &lt;strong&gt; y &lt;/strong&gt;. Cuando esta cadena se envía al navegador, muestra el texto literal <strong>World</strong> en lugar de renderizar el marcado en negrita.

El parámetro $flags: manejo de comillas

El segundo parámetro, $flags, especifica cómo manejar las comillas y qué tipo de documento usar. La opción más habitual es ENT_QUOTES, que convierte tanto las comillas simples (') como las dobles ("). Esto es importante cuando se coloca un valor dentro de un atributo HTML, ya que una comilla sin escapar podría cerrar el atributo prematuramente e inyectar nuevos atributos.

php— editable, runs on the server

Salida:

I&#039;m a paragraph

La comilla simple se convirtió a &#039;. Los valores de indicadores más comunes son:

  • ENT_QUOTES — convierte tanto comillas dobles como simples (recomendado).
  • ENT_COMPAT — convierte comillas dobles, deja las simples sin modificar.
  • ENT_NOQUOTES — deja ambos tipos de comillas sin convertir.
  • ENT_SUBSTITUTE — reemplaza secuencias de unidad de código no válidas con &#xFFFD; en lugar de devolver una cadena vacía.

El parámetro $encoding

El tercer parámetro, $encoding, indica la codificación de caracteres de la cadena de entrada. Su valor predeterminado es el de la configuración INI default_charset (UTF-8 en instalaciones modernas). Especificarlo explícitamente evita sorpresas si la entrada usa una codificación diferente.

php— editable, runs on the server

Salida:

Tom &amp; Jerry

Aquí el ampersand se codifica como &amp; mientras PHP interpreta la entrada como UTF-8. Si la codificación no coincide con los bytes reales de $string, la función puede devolver una cadena vacía (o un carácter de sustitución cuando ENT_SUBSTITUTE está activo).

El parámetro $double_encode

El cuarto parámetro, $double_encode, controla si las entidades existentes se codifican de nuevo. Por defecto es true, por lo que una cadena que ya contiene &lt; se convierte en &amp;lt;. Establecerlo en false deja intactas las entidades ya codificadas — útil cuando la entrada ya ha sido parcialmente escapada.

php— editable, runs on the server

Salida:

Hello &lt;strong&gt;World&lt;/strong&gt;!

Las entidades &lt; y &gt; existentes se dejan sin cambios porque $double_encode es false. Con el valor predeterminado true, la misma entrada habría producido Hello &amp;lt;strong&amp;gt;....

Prevención de XSS en la práctica

El uso más importante de htmlspecialchars() es escapar cualquier dato que no se controle completamente — entrada de formularios, valores de cadenas de consulta, registros de base de datos originados por usuarios — antes de mostrarlo en una página:

<?php
$comment = $_GET['comment'] ?? '';   // e.g. "<script>alert('xss')</script>"
echo "<p>" . htmlspecialchars($comment, ENT_QUOTES, "UTF-8") . "</p>";
?>

La etiqueta <script> queda neutralizada como &lt;script&gt;...&lt;/script&gt;, de modo que el navegador muestra el texto en lugar de ejecutarlo. Aplica el escapado en el momento de la salida, no al almacenar los datos, para que el valor original esté disponible en otros contextos.

Reversión de la conversión

Para volver a convertir las entidades a sus caracteres originales, usa htmlspecialchars_decode(). Pasa los mismos indicadores que usaste al codificar para que las comillas se manejen de forma simétrica.

Funciones relacionadas

  • htmlentities() — similar a htmlspecialchars() pero convierte todos los caracteres que tienen equivalentes de entidades HTML, no solo los cinco especiales.
  • htmlspecialchars_decode() — la función inversa de esta.
  • strip_tags() — elimina completamente las etiquetas HTML y PHP en lugar de escaparlas.
  • nl2br() — inserta <br> antes de los saltos de línea, que se suele usar después de escapar texto sin formato.

Resumen

Usa htmlspecialchars() siempre que muestres texto no confiable en HTML. Pasa ENT_QUOTES y una codificación UTF-8 explícita para obtener resultados predecibles y seguros en todas las versiones de PHP, escapa en el momento de la salida, y recurre a htmlentities() solo cuando necesites codificar todas las entidades y no solo los cinco caracteres especiales.

Práctica

Práctica
¿Cuál es la tarea principal de la función htmlspecialchars() en PHP?
¿Cuál es la tarea principal de la función htmlspecialchars() en PHP?
Was this page helpful?