C'est ma tentative de créer un svg sanitizer décent en PHP. L'ouvrage est largement emprunté à DOMPurify.
Soit il faut exiger enshrined/svg-sanitize
via composer, soit télécharger le dépôt et inclure l'ancienne méthode !
Son utilisation est assez simple. Créez une nouvelle instance de enshrinedsvgSanitizeSanitizer
, puis appelez le sanitize
tout en transmettant votre SVG/XML sale.
Exemple de base
use enshrined svgSanitize Sanitizer ;
// Create a new sanitizer instance
$ sanitizer = new Sanitizer ();
// Load the dirty svg
$ dirtySVG = file_get_contents ( ' filthy.svg ' );
// Pass it to the sanitizer and get it back clean
$ cleanSVG = $ sanitizer -> sanitize ( $ dirtySVG );
// Now do what you want with your clean SVG/XML data
Cela renverra soit une chaîne SVG/XML nettoyée, soit un booléen false
si l'analyse XML échoue (généralement en raison d'un fichier mal formaté).
Vous pouvez transmettre votre propre liste blanche de balises et d'attributs en utilisant respectivement les méthodes Sanitizer::setAllowedTags
et Sanitizer::setAllowedAttrs
.
Ces méthodes nécessitent que vous implémentiez le enshrinedsvgSanitizedataTagInterface
ou enshrinedsvgSanitizedataAttributeInterface
.
Vous avez la possibilité de supprimer les attributs qui font référence à des fichiers distants, cela arrêtera les fuites HTTP mais ajoutera une surcharge au désinfectant.
La valeur par défaut est false, définie sur true pour supprimer les références.
$sanitizer->removeRemoteReferences(true);
Vous pouvez utiliser la méthode getXmlIssues()
pour renvoyer un tableau des problèmes survenus lors de la désinfection.
Cela peut être utile pour enregistrer ou fournir des informations à l'utilisateur sur les raisons pour lesquelles un SVG a été refusé.
$issues = $sanitizer->getXmlIssues();
Vous pouvez réduire la sortie XML en appelant $sanitizer->minify(true);
.
Une démo est disponible sur : http://svg.enshrined.co.uk/
Je viens de publier un plugin WordPress contenant ce code afin que vous puissiez nettoyer vos téléchargements WordPress. Il est disponible dans le répertoire des plugins WordPress : https://wordpress.org/plugins/safe-svg/
Michael Potter a aimablement créé un module Drupal pour cette bibliothèque qui est disponible sur : https://www.drupal.org/project/svg_sanitizer
Cette bibliothèque svg sanitizer est utilisée par défaut dans le cœur de TYPO3 v9 et versions ultérieures. Voir l'entrée correspondante du journal des modifications pour plus de détails.
Vous pouvez les exécuter en exécutant vendor/bin/phpunit
à partir du répertoire de base de ce package.
Grâce au travail de gudmdharalds, il existe désormais un scanner autonome qui peut être utilisé via la CLI.
Toutes les erreurs seront affichées au format JSON. Voir le PR pour un exemple.
Utilisez-le comme suit : php svg-scanner.php ~/svgs/myfile.svg
Des tests plus approfondis pour les SVG/XML seraient bien, j'essaierai de les ajouter bientôt. Si vous avez envie de le faire pour moi, faites-le et faites un PR !