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
<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
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