Pourquoi un fichier SVG est bloqué ou refusé à l'upload : le risque XSS expliqué
Un SVG n'est pas une simple image : c'est du XML qui peut embarquer du JavaScript, ce qui explique pourquoi de nombreux formulaires et CMS le refusent ou le neutralisent par défaut.
Un formulaire qui accepte les JPEG et PNG mais refuse ou “nettoie” systématiquement les SVG ne se trompe pas de prudence : contrairement aux autres formats d’image, le SVG est un document XML texte, pas une grille de pixels, et n’a aucune signature binaire fixe permettant de le distinguer avec certitude par ses seuls premiers octets.
Cette nature textuelle a une conséquence directe : un SVG peut contenir des éléments actifs — une balise <script>, un gestionnaire d’événement comme onload sur un élément interne, ou une référence vers une ressource externe — au même titre que n’importe quel document HTML. Rendu inline dans une page (SVG intégré directement dans le DOM, plutôt que chargé comme une simple image via <img>), ce contenu s’exécute exactement comme du JavaScript de page web, avec accès au contexte de la page qui l’affiche : c’est le scénario classique d’une injection XSS stockée via une photo de profil ou un logo uploadé par un utilisateur.
C’est aussi un cas où la validation par extension ou par en-tête Content-Type échoue par construction, pas seulement parce que ces valeurs sont falsifiables (voir valider le vrai type d’un fichier uploadé côté serveur) : même un contrôle de signature binaire, efficace contre un exécutable renommé en .jpg (voir extension vs signature binaire), ne peut rien détecter ici puisque le SVG n’a justement aucune signature à vérifier. Le problème se situe dans la structure XML elle-même, pas dans les premiers octets du fichier.
La réponse la plus courante côté serveur consiste soit à assainir le SVG en amont (suppression des balises et attributs actifs par une bibliothèque dédiée), soit à le convertir en image matricielle (PNG) avant tout affichage public, soit à le servir uniquement en téléchargement direct (Content-Disposition: attachment) plutôt qu’en affichage intégré, ce qui empêche son exécution dans le contexte de la page.
Côté utilisateur, la prudence est symétrique : ouvrir directement dans un navigateur un SVG reçu d’une source non fiable revient à ouvrir une page web dont on ne connaît pas le contenu, pas à afficher une simple image.
Vérifier le vrai contenu d'un fichier avant de l'ouvrir →
Formats concernés
Voir aussi
- Extension vs signature binaire : pourquoi renommer un fichier ne change pas ce qu'il est
- Valider le vrai type d'un fichier uploadé côté serveur (au-delà de l'extension et du Content-Type)
- Attaque par double extension (photo.jpg.exe) : comment la repérer avant d'ouvrir un fichier
Sources
Dernière mise à jour :