
Libreria PHP che sanifica SVG/XML non attendibili filtrando tag, attributi e riferimenti remoti per prevenire XSS e iniezione di script nei file SVG caricati o inline.
Questo è il mio tentativo di realizzare un discreto sanitizer per SVG in PHP. Il lavoro è in gran parte mutuato da DOMPurify.
Puoi richiedere enshrined/svg-sanitize tramite composer oppure scaricare il repository e includerlo alla vecchia maniera!
Usarlo è abbastanza semplice. Crea una nuova istanza di enshrined\svgSanitize\Sanitizer e poi chiama sanitize passando il tuo SVG/XML non sicuro
Esempio 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
Questo restituirà una stringa SVG/XML sanitizzata oppure il valore booleano false se il parsing XML non è riuscito (di solito a causa di un file malformato).
Restituisce inoltre false per gli input che non verranno passati al parser XML:
<svg> in un namespace diverso da SVGgetXmlIssues() indica il motivo.
Puoi passare una tua whitelist di tag e attributi usando rispettivamente i metodi Sanitizer::setAllowedTags e Sanitizer::setAllowedAttrs.
Questi metodi richiedono che tu implementi enshrined\svgSanitize\data\TagInterface o enshrined\svgSanitize\data\AttributeInterface.
<use> è consentito per impostazione predefinita, entro limiti su quanto le referenze possono espandersi (useThreshold()) e annidarsi (setUseNestingLimit()). Se non ti serve, ad esempio perché incorpori SVG non attendibili nelle tue pagine, lascia use fuori dalla tua allowlist di tag per rimuovere l'intera area.
Hai la possibilità di rimuovere gli attributi che fanno riferimento a file remoti; questo fermerà le fughe HTTP ma aggiungerà un sovraccarico al sanitizer.
Il valore predefinito è false, impostalo a true per rimuovere i riferimenti.
$sanitizer->removeRemoteReferences(true);
Quando abilitato, i riferimenti remoti vengono rimossi anche dal CSS all'interno degli elementi <style> e dal CSS negli attributi (url(), @import, image-set() e stringhe tra virgolette che iniziano con un URL remoto). Gli attributi srcset vengono rimossi del tutto, perché contengono un elenco di URL. Questa gestione del CSS è best-effort: non è un parser CSS completo. Trattala come difesa in profondità anziché come garanzia, e isola il CSS non attendibile nel punto in cui l'SVG viene incorporato.
Nota: se un elemento <style> o un attributo style contiene un riferimento remoto che viene rimosso, eventuali sequenze di escape CSS in quello stesso blocco vengono normalizzate (decodificate) nell'output. Si tratta di CSS semanticamente identico, ma riscriverà gli escape scritti a mano da un autore.
Puoi usare il metodo getXmlIssues() per ottenere un array dei problemi verificatisi durante la sanitizzazione.
Questo può essere utile per il logging o per fornire all'utente un feedback sul motivo per cui un SVG è stato rifiutato.
$issues = $sanitizer->getXmlIssues();
L'elenco contiene fino a 1.000 problemi. Se ce ne sono di più, l'ultima voce indica quanti sono stati omessi.
Puoi minificare l'output XML chiamando $sanitizer->minify(true);.
È disponibile una demo all'indirizzo: http://svg.enshrined.co.uk/
Ho appena rilasciato un plugin WordPress contenente questo codice, così puoi sanitizzare i tuoi caricamenti su WordPress. È disponibile nella directory dei plugin di WordPress: https://wordpress.org/plugins/safe-svg/
Michael Potter ha gentilmente creato un modulo Drupal per questa libreria, disponibile all'indirizzo: https://www.drupal.org/project/svg_sanitizer
Questa libreria di sanitizzazione SVG è utilizzata per impostazione predefinita nel core di TYPO3 v9 e versioni successive. Vedi la voce corrispondente nel changelog per maggiori dettagli.
Puoi eseguirli lanciando vendor/bin/phpunit dalla directory base di questo pacchetto.
Grazie al lavoro di gudmdharalds ora c'è uno scanner autonomo utilizzabile tramite la CLI.
Eventuali errori verranno restituiti in formato JSON. Vedi la PR per un esempio.
Usalo come segue: php svg-scanner.php ~/svgs/myfile.svg
Sarebbe gradito un testing più esteso per gli SVG/XML; cercherò di aggiungerlo presto. Se ti va di farlo per me, procedi pure e apri una PR!