Assainissement HTML côté serveur
Le service LgHtmlSanitizer (espace de noms Lagoon.Server.Services) assainit un contenu HTML à partir d'une liste blanche : il retire les scripts, les gestionnaires d'événements (onclick, onerror…), les URL dangereuses (javascript:…) et les formulaires avant que ce contenu ne soit affiché à d'autres utilisateurs. Il s'appuie sur la bibliothèque HtmlSanitizer.
Lagoon l'enregistre comme singleton dans toutes les applications serveur et l'utilise pour les CGU. Injectez-le dans vos services ou vos contrôleurs pour assainir tout autre contenu HTML saisi par un utilisateur, par exemple avec un LgHtmlEditor.
Utilisation
public class ArticleController : LgControllerBase
{
private readonly LgHtmlSanitizer _htmlSanitizer;
public ArticleController(LgHtmlSanitizer htmlSanitizer)
{
_htmlSanitizer = htmlSanitizer;
}
[HttpPost]
public async Task<IActionResult> SaveAsync(ArticleDto article)
{
try
{
// Sanitize the HTML entered in the LgHtmlEditor before storing it
article.Content = _htmlSanitizer.Sanitize(article.Content);
// ...
return Ok();
}
catch (Exception ex)
{
return Problem(ex);
}
}
}
| Méthode | Usage |
|---|---|
Sanitize(string html) | Fragment HTML, par exemple le contenu produit par un LgHtmlEditor. |
SanitizeDocument(string html) | Document HTML complet (html, head, body), par exemple un fichier exporté d'un traitement de texte. |
Les deux méthodes renvoient null ou une chaîne vide telle quelle et peuvent être appelées en parallèle.
Règles appliquées
Lagoon part de la liste blanche par défaut de HtmlSanitizer (balises de mise en forme, listes, tableaux, liens, images, attribut style limité à une liste de propriétés CSS), puis :
- retire les formulaires (
form,input,button,select,textarea…) et leurs attributs (action,method…) : un formulaire pourrait collecter des données et les envoyer vers une URL externe ; - autorise l'attribut
classet le schéma d'URLmailto:en plus dehttp:ethttps:; - conserve les images intégrées
data:image/...dans l'attributsrcdes balisesimg(images collées dans l'éditeur) ; - pour
SanitizeDocumentuniquement, conserve les élémentsstyle(dont le contenu est lui-même assaini) et les règles@page,@mediaet@font-face, pour qu'un document exporté d'un traitement de texte garde sa mise en page. Les autres éléments duhead(meta,title,link,script…) sont supprimés.
Les iframe (vidéos insérées avec l'éditeur, par exemple) sont supprimées.
Configuration
Les options sont lues dans la section Lagoon:HtmlSanitizer du fichier appsettings.json :
{
"Lagoon": {
"HtmlSanitizer": {
"AllowDataImages": true
}
}
}
| Option | Description |
|---|---|
AllowDataImages | Conserve les images intégrées data:image/... des balises img. La valeur par défaut est true. |
Pour modifier la liste blanche, complétez les options dans OnConfigureServices. La méthode ConfigureSanitizer reçoit l'objet HtmlSanitizer sous-jacent, après l'application des règles Lagoon, et un booléen qui vaut true pour le document complet :
protected override void OnConfigureServices(IServiceCollection services)
{
services.Configure<LgHtmlSanitizerOptions>(options =>
{
options.ConfigureSanitizer = (sanitizer, document) =>
{
// Keep the videos inserted with the HTML editor
sanitizer.AllowedTags.Add("iframe");
};
});
}
Chaque balise, attribut, propriété CSS ou schéma d'URL ajouté élargit la surface d'attaque. N'autorisez iframe que si la politique CSP limite les sources de cadres (directive frame-src, voir Content Security Policy).