Ver índice de contenidos del libro

7.10. Mecanismo de escape

Cuando generas código HTML a partir de una plantilla, siempre existe el riesgo de que alguna variable de la plantilla contenga código HTML erróneo o incluso peligroso. En el primer caso, el resultado es que el diseño de la página se puede romper. En el segundo caso, un usuario malicioso podría realizar un ataque de tipo XSS o Cross Site Scripting. Observa este clásico ejemplo de ataque XSS:

Hello {{ name }}
Hello <?php echo $name ?>

Imagina que el usuario utiliza el siguiente contenido como su nombre:

<script>alert('hello!')</script>

Si no aplicas ningún mecanismo de escape, la plantilla resultante mostraría un cuadro de alerta de JavaSript:

Hello <script>alert('hello!')</script>

Aunque este ejemplo parece inofensivo, si un usuario malicioso puede llegar hasta aquí, también podrá escribir código JavaScript más avanzado que realice operaciones no deseadas en nombre de cualquier otro usuario.

La respuesta a este problema es el mecanismo de escape, que hace que puedas renderizar cualquier plantilla sin problemas. El siguiente ejemplo muestra el resultado de mostrar la misma plantilla anterior pero con el mecanismo de escape activado:

Hello &lt;script&gt;alert(&#39;helloe&#39;)&lt;/script&gt;

Twig y PHP abordan este problema de formas diferentes. Si utilizas Twig, el mecanismo de escape ya está activado y tu aplicación está protegida. En PHP el mecanismo de escape no es automático, por lo que tendrás que proteger los contenidos uno a uno.

7.10.1. Mecanismo de escape en Twig

Si utilizas Twig para crear tus plantillas, el mecanismo de escape está activado por defecto. Esto significa que ya estás protegido frente a cualquier información que te llegue desde tus usuarios. Por defecto el mecanismo de escape protege los contenidos para mostrarlos en una página HTML, pero existen otras estrategias para proteger contenidos que se muestren dentro de código JavaScript, etc.

En ocasiones, tendrás que desactivar el mecanismo de escape para mostrar el contenido HTML de alguna variable fiable. Imagina que los usuarios de tipo administrador pueden escribir artículos que contienen código HTML. Por defecto Twig protegerá esos contenidos.

Para mostrar los contenidos originales, utiliza el filtro raw:

{{ articulo.contenido|raw }}

También puedes desactivar el mecanismo de escape dentro de un bloque ({% block %}) o incluso en una plantilla completa.

7.10.2. Mecanismo de escape en PHP

El mecanismo de escape no es automático cuando utilizas plantillas PHP. Esto significa que no estás protegido a menos que escapes explícitamente todas y cada una de las variables. Para utilizar el mecanismo de escape, usa el método especial de la vista escape():

Hello <?php echo $view->escape($name) ?>

Por defecto el método escape() supone que la variable se está renderizando en una página HTML (y por tanto, la variable se escapa para que sea segura desde el punto de vista de HTML). Un segundo argumento opcional del método te permite cambiar este comportamiento. Para incluir de forma segura un contenido dentro de una cadena de código JavaScript, utiliza la estrategia js:

var myMsg = 'Hello <?php echo $view->escape($name, 'js') ?>';