Esta é minha tentativa de construir um svg sanitizer decente em PHP. O trabalho é em grande parte emprestado do DOMPurify.
Exija enshrined/svg-sanitize
por meio do compositor ou baixe o repositório e inclua da maneira antiga!
Usar isso é bastante fácil. Crie uma nova instância de enshrinedsvgSanitizeSanitizer
e então chame o sanitize
enquanto passa seu SVG/XML sujo
Exemplo 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
Isso retornará uma string SVG/XML higienizada ou um booleano false
se a análise XML falhar (geralmente devido a um arquivo mal formatado).
Você pode passar sua própria lista de permissões de tags e atributos usando os métodos Sanitizer::setAllowedTags
e Sanitizer::setAllowedAttrs
respectivamente.
Esses métodos exigem que você implemente enshrinedsvgSanitizedataTagInterface
ou enshrinedsvgSanitizedataAttributeInterface
.
Você tem a opção de remover atributos que fazem referência a arquivos remotos. Isso impedirá vazamentos de HTTP, mas adicionará uma sobrecarga ao sanitizador.
O padrão é falso, definido como verdadeiro para remover referências.
$sanitizer->removeRemoteReferences(true);
Você pode usar o método getXmlIssues()
para retornar uma série de problemas que ocorreram durante a higienização.
Isso pode ser útil para registrar ou fornecer feedback ao usuário sobre o motivo pelo qual um SVG foi recusado.
$issues = $sanitizer->getXmlIssues();
Você pode reduzir a saída XML chamando $sanitizer->minify(true);
.
Há uma demonstração disponível em: http://svg.enshrined.co.uk/
Acabei de lançar um plugin para WordPress contendo este código para que você possa limpar seus uploads do WordPress. Está disponível no diretório de plugins do WordPress: https://wordpress.org/plugins/safe-svg/
Michael Potter gentilmente criou um módulo Drupal para esta biblioteca que está disponível em: https://www.drupal.org/project/svg_sanitizer
Esta biblioteca svg sanitizer é usada por padrão no núcleo do TYPO3 v9 e versões posteriores. Consulte a entrada correspondente do changelog para obter mais detalhes.
Você pode executá-los executando vendor/bin/phpunit
no diretório base deste pacote.
Graças ao trabalho de gudmdharalds, agora existe um scanner independente que pode ser usado através da CLI.
Quaisquer erros serão gerados no formato JSON. Veja o PR como exemplo.
Use-o da seguinte maneira: php svg-scanner.php ~/svgs/myfile.svg
Testes mais extensos para SVGs/XML seriam ótimos, tentarei adicioná-los em breve. Se você quiser fazer isso por mim, faça e faça um PR!