Aller au contenu

SVG : Scalable Vector Graphics

Infrastructure

SVG : Scalable Vector Graphics. « Graphiques vectoriels redimensionnables », par analogie avec un tracé au compas et à la règle qu'on peut refaire à n'importe quelle taille, là où une photo agrandie finit en mosaïque de carrés.

Diagramme de séquence entre cinq acteurs : Utilisateur, Serveur, Navigateur, Moteur de rendu et Moteur JavaScript. 1, l'utilisateur envoie (upload) un fichier SVG au serveur. 2, le serveur le sert au navigateur en image/svg+xml. Ensuite, deux cas : 3, si le fichier est chargé via une balise img, le navigateur le confie au moteur de rendu, qui fait le dessin seul et ignore les scripts. 4, si le fichier est ouvert directement ou injecté dans la page, le navigateur le confie au moteur JavaScript, qui exécute ses scripts dans l'origine du site.

Du texte, pas des pixels : Un fichier SVG est un document XML qui décrit des formes, des chemins, des couleurs et du texte par leurs coordonnées. Il se lit, se compresse, se versionne et se modifie dans un éditeur de texte comme n'importe quel code source.

Vectoriel contre matriciel : Le rendu est recalculé à chaque affichage : une icône SVG reste nette sur une montre comme sur un écran de salle de réunion. En contrepartie, le format convient mal aux photos, qui restent l'affaire du PNG ou du JPEG.

Un document actif : Le SVG accepte des balises <script>, des gestionnaires d'événements et des références externes : c'est un document, pas une image. Accepter des SVG dans un formulaire de téléversement au motif que « c'est juste une image », c'est accueillir une page web qui a eu la courtoisie de se déguiser en logo.

Tout dépend du chargement : Chargé par une balise <img>, le fichier est dessiné et n'exécute rien. Ouvert à sa propre adresse, ou placé dans un <iframe>, c'est une page complète dont les scripts tournent dans l'origine qui la sert. Injecté dans le HTML d'une page, ses gestionnaires d'événements s'exécutent : le <svg onload=…> est un classique du XSS.

Désamorcer : Trois gestes, dans cet ordre : assainir le fichier reçu (DOMPurify, par exemple), le servir depuis un domaine séparé ou avec un en-tête Content-Disposition: attachment, et verrouiller ce qui reste par une Content-Security-Policy. Vérifier l'extension ne sert à rien : le danger est dans le contenu, pas dans le nom du fichier.

Explication de la marmotte

Imagine deux façons d'envoyer un dessin à un ami. La première : une photo du dessin. Si ton ami l'agrandit sur un grand écran, il voit apparaître des petits carrés flous. La seconde : une liste d'instructions, du genre « trace un cercle rouge au milieu, puis un trait noir d'un coin à l'autre ». Ton ami peut refaire le dessin en tout petit ou en géant, et il reste parfaitement net. Ce format d'image fonctionne comme cette liste. Il y a un piège : comme ce sont des instructions écrites, quelqu'un de malin peut y glisser des ordres qui ne dessinent rien et qui font faire autre chose à ton navigateur internet. C'est pour ça que les sites prudents vérifient ces fichiers avant de les afficher.

Où ce terme est utilisé

← Tout le glossaire