JSoup : validation et sécurisation des contenus html soumis

Vous avez probablement tous déjà réalisé une application contenant des champs rich text. Ces champs rich text permettent aux utilisateurs d'exprimer pleinement leur talent en soumettant du code html (cms, wiki, blog, etc etc...). Malheureusement ils impliquent également un certain nombre de contraintes de sécurité et/ou de validation.

Certains frameworks offrent des composants plus ou moins complets qui traitent ces contraintes aussi bien coté client que coté serveur mais ils sont peu souples. D'autres produits, plus aboutis, s’arrêtent coté client (au hasard CKEditor ou TinyMCE).

J'aimerais donc vous présenter une librairie qui, couplée à ces produits, peut être très utile. Il s'agit de JSoup. Avantage non négligeable de cette API : elle est simple et légère.

Installation

Vous pouvez l'installer très rapidement dans votre projet avec la dépendance maven suivante :

<dependency>
  <groupId>org.jsoup</groupId>
  <artifactId>jsoup</artifactId>
  <version>1.8.1</version>
</dependency>

L'API tourne à partir de Java 1.5, et sur Scala, Android, OSGi, Google App Engine.

Utilisation

Le principe est simple, l'API fournit une méthode "clean()" qui prend en entrée le html soumis et le nettoie en supprimant les balises non-autorisées et/ou les codes malicieux (attaques XSS). Les balises autorisées sont déclarées dans une "Whitelist", qui est également donnée en entrée. Deux lignes de codes suffisent à présenter l'utilisation :
String unsafe = "<p><a href='http://example.com/' onclick='stealCookies()'>Link</a></p>";
String safe = Jsoup.clean(unsafe, Whitelist.basic());
// now: <p><a href="http://example.com/" rel="nofollow">Link</a></p>

On peut aller plus loin en détaillant l'utilisation des "Whitelist". L'API fournit des "Whitelist" prédéfinies. Elles sont au nombre de cinq :

  • none  :  Autorise les éléments texte. Les autres sont supprimés.
  • simpleText  : Autorise seulement ces balises : b, em, i, strong, u.
  • basic : a, b, blockquote, br, cite, code, dd, dl, dt, em, i, li, ol, p, pre, q, small, strike, strong, sub, sup, u, ul, http, https, ftp, mailto, rel=nofollow
  • basicWithImages :  basic + image.
  • relaxed : Autorise tous les éléments texte et html du body.

Il est possible de surcharger ces dernières, de façon chainée, en ajoutant des balises ou des attributs autorisés. L'idéal étant d'enrichir une "Whitelist" prédéfinie pour correspondre au besoin exprimé :

Whitelist myWhitelist = Whitelist.simpleText().addTags("a").addAttributes("a", "href", "name", "rel", "target");

 Plus loin

Sachez également que JSoup peut être utilisé dans un cadre plus vaste. On peut par exemple l'utiliser pour réaliser des crawler web ou tout simplement parser des documents.

Vous pouvez trouver la documentation complète sur le site officiel : http://jsoup.org

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.