Este es mi intento de crear un svg sanitizer decente en PHP. El trabajo está tomado en gran medida de DOMPurify.
¡Requiera enshrined/svg-sanitize
a través del compositor o descargue el repositorio e inclúyalo a la antigua usanza!
Usar esto es bastante fácil. Cree una nueva instancia de enshrinedsvgSanitizeSanitizer
y luego llame a sanitize
mientras pasa su 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 desinfectada o un valor booleano false
si falla el análisis XML (generalmente debido a un archivo mal formateado).
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 enshrinedsvgSanitizedataTagInterface
o enshrinedsvgSanitizedataAttributeInterface
.
Tiene la opción de eliminar atributos que hacen referencia a archivos remotos; esto detendrá las fugas de HTTP pero agregará una sobrecarga al desinfectante.
El valor predeterminado es falso y se establece en verdadero para eliminar referencias.
$sanitizer->removeRemoteReferences(true);
Puede utilizar el método getXmlIssues()
para devolver una serie de problemas que ocurrieron durante la desinfección.
Esto puede resultar útil para iniciar sesión o proporcionar comentarios al usuario sobre por qué se rechazó un SVG.
$issues = $sanitizer->getXmlIssues();
Puede minimizar la salida XML llamando $sanitizer->minify(true);
.
Hay una demostración disponible en: http://svg.enshrined.co.uk/
Acabo de lanzar un complemento de WordPress que contiene este código para que puedas desinfectar tus cargas de WordPress. Está disponible en el directorio de complementos de WordPress: https://wordpress.org/plugins/safe-svg/
Michael Potter ha creado amablemente un módulo Drupal para esta biblioteca que está disponible en: https://www.drupal.org/project/svg_sanitizer
Esta biblioteca svg sanitizer se utiliza de forma predeterminada en el núcleo de TYPO3 v9 y versiones posteriores. Consulte la entrada correspondiente del registro de cambios para obtener más detalles.
Puede ejecutarlos ejecutando vendor/bin/phpunit
desde el directorio base de este paquete.
Gracias al trabajo de gudmdharalds, ahora existe un escáner independiente que se puede utilizar a través de la CLI.
Cualquier error se generará en formato JSON. Consulte las relaciones públicas para ver un ejemplo.
Úselo de la siguiente manera: php svg-scanner.php ~/svgs/myfile.svg
Sería fantástico realizar pruebas más exhaustivas para los SVG/XML. Intentaré agregarlas pronto. Si tienes ganas de hacerlo por mí, ¡hazlo y haz un PR!