
PHP-Bibliothek, die nicht vertrauenswürdige SVG/XML-Dateien bereinigt, indem sie Tags, Attribute und Remote-Referenzen filtert, um XSS und Skript-Injection in hochgeladenen oder inline eingebetteten SVG-Dateien zu verhindern.
Dies ist mein Versuch, einen brauchbaren SVG-Sanitizer in PHP zu erstellen. Die Arbeit ist größtenteils von DOMPurify übernommen.
Entweder enshrined/svg-sanitize über Composer einbinden oder das Repository herunterladen und auf die altmodische Weise einbinden!
Die Verwendung ist recht einfach. Erstellen Sie eine neue Instanz von enshrined\svgSanitize\Sanitizer und rufen Sie dann sanitize auf, während Sie Ihr unsauberes SVG/XML übergeben.
Einfaches Beispiel
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
Dies gibt entweder einen bereinigten SVG/XML-String oder den booleschen Wert false zurück, wenn die XML-Analyse fehlgeschlagen ist (normalerweise aufgrund einer schlecht formatierten Datei).
Es gibt auch false für Eingaben zurück, die nicht an den XML-Parser weitergegeben werden:
<svg>-Wurzelelement in einem anderen Namespace als SVGgetXmlIssues() gibt den Grund an.
Sie können Ihre eigene Whitelist von Tags und Attributen übergeben, indem Sie die Methoden Sanitizer::setAllowedTags bzw. Sanitizer::setAllowedAttrs verwenden.
Diese Methoden erfordern, dass Sie das enshrined\svgSanitize\data\TagInterface oder enshrined\svgSanitize\data\AttributeInterface implementieren.
<use> ist standardmäßig erlaubt, jedoch mit Begrenzungen dafür, wie weit Referenzen expandieren (useThreshold()) und verschachteln (setUseNestingLimit()) können. Wenn Sie es nicht benötigen, beispielsweise weil Sie nicht vertrauenswürdiges SVG in Ihre Seiten einbetten, lassen Sie use aus Ihrer Tag-Allowlist weg, um diesen gesamten Bereich zu entfernen.
Sie haben die Möglichkeit, Attribute zu entfernen, die auf entfernte Dateien verweisen. Dies stoppt HTTP-Leaks, verursacht jedoch einen zusätzlichen Overhead für den Sanitizer.
Dies ist standardmäßig auf false gesetzt; setzen Sie es auf true, um Referenzen zu entfernen.
$sanitizer->removeRemoteReferences(true);
Wenn aktiviert, werden Remote-Referenzen auch aus CSS innerhalb von <style>-Elementen und aus CSS in Attributen entfernt (url(), @import, image-set() und Zeichenketten in Anführungszeichen, die mit einer Remote-URL beginnen). srcset-Attribute werden vollständig entfernt, da sie eine Liste von URLs enthalten. Diese CSS-Behandlung erfolgt nach bestem Bemühen: Es handelt sich nicht um einen vollständigen CSS-Parser. Betrachten Sie sie als Defense-in-Depth und nicht als Garantie, und isolieren Sie nicht vertrauenswürdiges CSS an der Stelle, an der das SVG eingebettet wird.
Hinweis: Wenn ein <style>-Element oder ein style-Attribut eine Remote-Referenz enthält, die entfernt wird, werden alle CSS-Escape-Sequenzen in demselben Block in der Ausgabe normalisiert (dekodiert). Dies ist semantisch identisches CSS, schreibt jedoch Escapes um, die ein Autor von Hand geschrieben hat.
Sie können die Methode getXmlIssues() verwenden, um ein Array von Problemen zurückzugeben, die während der Sanitization aufgetreten sind.
Dies kann nützlich sein für die Protokollierung oder um dem Benutzer Feedback dazu zu geben, warum ein SVG abgelehnt wurde.
$issues = $sanitizer->getXmlIssues();
Die Liste enthält bis zu 1.000 Probleme. Wenn es mehr gibt, gibt der letzte Eintrag an, wie viele ausgelassen wurden.
Sie können die XML-Ausgabe minifizieren, indem Sie $sanitizer->minify(true); aufrufen.
Eine Demo ist verfügbar unter: http://svg.enshrined.co.uk/
Ich habe gerade ein WordPress-Plugin mit diesem Code veröffentlicht, damit Sie Ihre WordPress-Uploads bereinigen können. Es ist im WordPress-Plugin-Verzeichnis verfügbar: https://wordpress.org/plugins/safe-svg/
Michael Potter hat freundlicherweise ein Drupal-Modul für diese Bibliothek erstellt, das unter folgender Adresse verfügbar ist: https://www.drupal.org/project/svg_sanitizer
Diese SVG-Sanitizer-Bibliothek wird standardmäßig im Kern von TYPO3 v9 und späteren Versionen verwendet. Weitere Details finden Sie im entsprechenden Changelog-Eintrag.
Sie können diese ausführen, indem Sie vendor/bin/phpunit aus dem Basisverzeichnis dieses Pakets ausführen.
Dank der Arbeit von gudmdharalds gibt es jetzt einen eigenständigen Scanner, der über die CLI verwendet werden kann.
Alle Fehler werden im JSON-Format ausgegeben. Ein Beispiel finden Sie im PR.
Verwenden Sie ihn wie folgt: php svg-scanner.php ~/svgs/myfile.svg
Umfangreichere Tests für die SVGs/XML wären wunderbar; ich werde versuchen, diese bald hinzuzufügen. Wenn Sie Lust haben, das für mich zu erledigen, tun Sie es bitte und erstellen Sie einen PR!