
Biblioteca PHP que sanitiza SVG/XML no confiable filtrando etiquetas, atributos y referencias remotas para prevenir XSS e inyección de scripts en archivos SVG subidos o insertados en línea.
Este es mi intento de construir un sanitizador de SVG decente en PHP. El trabajo está en gran medida tomado de DOMPurify.
¡O bien requiere enshrined/svg-sanitize a través de composer o descarga el repositorio e inclúyelo a la antigua usanza!
Usar esto es bastante fácil. Crea una nueva instancia de enshrined\svgSanitize\Sanitizer y luego llama a sanitize mientras le pasas tu SVG/XML sucio
Ejemplo básico
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
Esto devolverá una cadena SVG/XML saneada o el booleano false si el análisis XML falló (normalmente debido a un archivo mal formateado).
También devuelve false para las entradas que no entregará al analizador XML:
<svg> en un espacio de nombres distinto de SVGgetXmlIssues() indica el motivo.
Puede pasar su propia lista blanca de etiquetas y atributos utilizando los métodos Sanitizer::setAllowedTags y Sanitizer::setAllowedAttrs respectivamente.
Estos métodos requieren que implemente enshrined\svgSanitize\data\TagInterface o enshrined\svgSanitize\data\AttributeInterface.
<use> está permitido por defecto, con límites sobre cuánto pueden expandirse las referencias (useThreshold()) y anidarse (setUseNestingLimit()). Si no lo necesita, por ejemplo porque inserta SVG no confiable directamente en sus páginas, deje use fuera de su lista de etiquetas permitidas para eliminar toda esa área.
Tiene la opción de eliminar los atributos que hacen referencia a archivos remotos; esto detendrá las filtraciones HTTP pero añadirá una sobrecarga al saneador.
Esto es false por defecto; establézcalo en true para eliminar las referencias.
$sanitizer->removeRemoteReferences(true);
Cuando está habilitado, las referencias remotas también se eliminan del CSS dentro de los elementos <style> y del CSS en los atributos (url(), @import, image-set() y cadenas entrecomilladas que comienzan con una URL remota). Los atributos srcset se eliminan por completo, porque contienen una lista de URL. Este manejo de CSS es de mejor esfuerzo: no es un analizador de CSS completo. Trátelo como defensa en profundidad en lugar de una garantía, y aísle el CSS no confiable en el punto donde se incrusta el SVG.
Nota: si un elemento <style> o un atributo style contiene una referencia remota que se elimina, cualquier secuencia de escape de CSS en ese mismo bloque se normaliza (decodifica) en la salida. Es CSS semánticamente idéntico, pero reescribirá los escapes que un autor escribió a mano.
Puede usar el método getXmlIssues() para devolver un array de problemas que ocurrieron durante el saneamiento.
Esto puede ser útil para el registro o para proporcionar información al usuario sobre por qué se rechazó un SVG.
$issues = $sanitizer->getXmlIssues();
La lista contiene hasta 1.000 problemas. Si hay más, la última entrada indica cuántos quedaron fuera.
Puede minificar la salida XML llamando a $sanitizer->minify(true);.
Hay una demostración disponible en: http://svg.enshrined.co.uk/
Acabo de publicar un plugin de WordPress que contiene este código para que pueda sanear sus cargas de WordPress. Está disponible en el directorio de plugins de WordPress: https://wordpress.org/plugins/safe-svg/
Michael Potter ha creado amablemente un módulo de Drupal para esta biblioteca, que está disponible en: https://www.drupal.org/project/svg_sanitizer
Esta biblioteca de saneamiento de SVG se usa por defecto en el núcleo de TYPO3 v9 y versiones posteriores. Consulte la entrada correspondiente del changelog para más detalles.
Puede ejecutarlas ejecutando vendor/bin/phpunit desde el directorio base de este paquete.
Gracias al trabajo de gudmdharalds, ahora hay un escáner independiente que se puede usar mediante la CLI.
Cualquier error se mostrará en formato JSON. Consulte el PR para ver un ejemplo.
Úselo de la siguiente manera: php svg-scanner.php ~/svgs/myfile.svg
Sería estupendo realizar pruebas más exhaustivas para los SVG/XML; intentaré añadirlas pronto. Si le apetece hacerlo por mí, ¡adelante y envíe un PR!