Le filtre raw de Twig et SensioLabs Insight

Le filtre raw de Twig et SensioLabs Insight

Vous utilisez peut être Insight, l'outils d'analyse de code de SensioLabs. Insight est capable d'analyser une application Symfony afin de vous remonter différentes alertes tant sur les bonnes pratiques que sur la sécurité ou encore la performance de votre code.

J'ai récemment été confronté à une alerte critique de sécurité concernant l'utilisation du filtre Twig |raw dans mes templates. Ce filtre permet d'accéder au contenu d'une variable sans escaping. En effet, l'utilisation de ce filtre peut être dangereux car le contenu des variables peut potentiellement être saisi par l'utilisateur ce qui constitue une faille XSS.

Website should be protected against XSSVulnerability

Dans mon cas, les variables que je passais dans le filtre contenaient du html que je souhaitais afficher. La solution est de créer son propre filtre Twig afin de ne pas échapper le html.

class AcmeExtension extends \Twig_Extension
{
    public function getFilters()
    {
        return [
            new \Twig_SimpleFilter('html', [$this, 'html'], ['is_safe' => ['html']]),
        ];
    }

    public function html($html)
    {
        return $html;
    }

    public function getName()
    {
        return 'acme_extension';
    }
}

Comme vous pouvez le constater, ce nouveau filtre ne fait rien, la différence ce situe au niveau de sa déclaration. L'option 'is_safe' => 'html' permet d'indiquer à Twig de ne pas échapper le html en sortie du filtre.

Cette options peut prendre les valeurs html, js, css, html_attr, url ou all afin de contrôler ce qui sera échappé ou non.

Si nécessaire, vous pouvez également utiliser l'option pre_escape pour gérer l'échappement en entrée du filtre.

new \Twig_SimpleFilter('html', [$this, 'html'], ['pre_escape' => ['html'], 'is_safe' => ['html']]),

Puis dans vos templates :

{{ content|html }}

Le contenu html de votre variable s'affichera correctement mais le Javascript et le CSS sera échapper. Vous corrigerez ainsi l'alerte de sécurité de Insight.

Pour plus d'informations, vous pouvez consulter la documentation Twig sur l'auto-escapting.

Les commentaires