Output escaping en Twig

El escapado de variables por defecto se realiza de forma automática en Twig, pero se puede desactivar de forma global

Contenido modificable

Si ves errores o quieres modificar/añadir contenidos, puedes crear un pull request. Gracias

Cuando se genera HTML desde una template, hay siempre un riesgo de que una variable de una template muestre contenido HTML no intencionado o código peligroso por parte de terceros. El resultado es que el contenido dinámico podría romper el HTML de la página o permitir a usuarios realizar ataques XSS (Cross Site Scripting).

En las plantillas Twig el output escaping está activado por defecto, asumiendo que el contenido que se va a escapar es para mostrar HTML. El siguiente ejemplo muestra el contenido de un artículo:

{{ article.body }}

En algunos casos puede ser necesario desactivar output escaping para renderizar una variable en la que se confía y contiene lenguaje de marcado que no ha de escaparse. Para esto simplemente se añade la etiqueta raw:

{{ article.body|raw }}

Podemos desactivar el autoescaping de forma global desactivando en el archivo de configuración (app/config/config.yml) el key autoescape:

twig:
    // ...
    autoescape: false

Si tenemos el autoescaping desactivado, podemos escapar manualmente de la siguiente forma:

{{ article.body|e }}

Por defecto escapará los contenidos para HTML, pero puedes especificar otros formatos:

{{ article.body|e('js') }}
{{ article.body|e('css') }}
{{ article.body|e('url') }}
{{ article.body|e('html_attr') }}

Independientemente de si el escapado automático está activado o no, se puede marcar una sección de una template como escaped con la tag autoescape:

{% autoescape %}
    Aquí todo será escapado (en HTML)
    {{ foo }} {# La variable foo se escapará #}
    {{ var|raw }} {# La variable var no se escapará #}
{% endautoescape %}

Y también podemos especificar un formato concreto:

{% autoescape 'js' %}
    Aquí todo será escapado (en JS)
{% endautoescape %}

Si ya se ha escapado algo, Twig no lo escapará otra vez aunque se les aplique las etiquetas e o escape.

Tampoco escapa las expresiones static:

{% set hola = "<strong>Hola</strong>" %}
{{ hola }}
{{ "<strong>world</strong>" }}

En el ejemplo anterior no escapará Hola.