Aller au contenu principal

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​

ArticleController.cs
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éthodeUsage
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 class et le schéma d'URL mailto: en plus de http: et https: ;
  • conserve les images intégrées data:image/... dans l'attribut src des balises img (images collées dans l'éditeur) ;
  • pour SanitizeDocument uniquement, conserve les éléments style (dont le contenu est lui-même assaini) et les règles @page, @media et @font-face, pour qu'un document exporté d'un traitement de texte garde sa mise en page. Les autres éléments du head (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
}
}
}
OptionDescription
AllowDataImagesConserve 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 :

Main.cs
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");
};
});
}
attention

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