Faille XSS, et Symfony

28 octobre 2008

Que est ce que la faille XSS ?

XSS ou le cross site scripting est l’une des failles les plus répandues dans les sites web dynamiques si ce n’est la plus répandue. Elle consiste en fait au passage d’un code éxécutable par le navigateur (JavaScript ou autre) en utilisant des formulaires ou diréctement l’URL. L’exploitation de cette faille permeterai notemment d’éxécuter des scripts douteux directement dans votre serveur web, c’est qui fournirai par exemple énormément d’informations sur le serveur …

Pour vérifier la présence d’une telle faille dans un formulaire par exemple, il suffit de remplir un champ du formulaire ou tous les champs (ça dépend du formulaire) par exemple par :

<script>alert('Ceci est une faille XSS')</script>

Symfony et la faille XSS ?

J’ai longtemps cru à tord que symfony était par défaut protégé contre ce type de failles, jusqu’à ce qu’un testeur de Bloginy (un projet fait avec Symfony), m’indique que mon formulaire de recherche est vulnérable. En fait, symfony dispose d’une manière automatique d’éviter ces failles, mais ne l’active pas par défaut.

Pour palier à ces failles, symfony dispose donc d’un moyen d’échapement (escaping) pour tous vos données manipulés (c’est à dire que vos données sont automatiquement convertis au code XHTML correspondant). Par exemple, si vous entrez : <script>alert(‘Ceci est une faille XSS’)</script>, bain en réalité vous manipulerez le texte suivant : &lt;script&gt;alert(‘Ceci est une faille XSS’)&lt;/script&gt;. Et ce texte ne poura être éxécuté en tant que code par le navigateur.

Comment activer l’échappement automatique ?

Rien de plus simple, par défaut Symfony utilise la stratégie d’échappement « bc », qui ne vous protège pas par défaut des failles XSS, il faut donc modifier le fichier setting.yml de votre application Symfony comme suit :

all:
  .settings:
    escaping_strategy: both
    escaping_method: ESC_ENTITIES

Maintenant, toutes vos données seront transformées, et vous êtes protégés automatiquement de ce genre de failles.

Et si je voulais que le code soit interprété :

Il peut arriver que vous ayez besoin que le navigateur interprète ce que l’utilisateur entre, tel qu’il est. Par exemple pour afficher du code HTML généré par les utilisateurs (dans le cas d’un message dans un forum par exemple). Rien de plus simple la aussi, une variable transformée $var, est accessible sans échappement comme ceci : $sf_data->get(‘test’).

Si votre donnée est un objet, et que vous désirez accéder à un membre de cet objet sans échappement, rien de plus simple : $objet->getRawValue()->getMembre().

Voilà, j’espère que vous êtes maintenant plus éclairés sur les failles XSS, et la manière de les évitez grâce au framework Symfony. Si vous rencontrez toujours des problèmes, n’hésitez pas à laisser des commentaires.

Laisser un commentaire