
Biblioteca PHP que sanitiza SVG/XML não confiáveis filtrando tags, atributos e referências remotas para prevenir XSS e injeção de scripts em arquivos SVG enviados ou embutidos.
Esta é a minha tentativa de construir um sanitizador de SVG decente em PHP. O trabalho é em grande parte emprestado do DOMPurify.
Ou requira enshrined/svg-sanitize através do composer ou baixe o repositório e inclua da forma antiga!
Usar isto é bastante fácil. Crie uma nova instância de enshrined\svgSanitize\Sanitizer e depois chame o sanitize passando o 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 sanitizada ou o booleano false se o parsing do XML falhar (geralmente devido a um arquivo mal formatado).
Também retorna false para entradas que não serão entregues ao parser de XML:
<svg> em um namespace diferente de SVGgetXmlIssues() informa o motivo.
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 enshrined\svgSanitize\data\TagInterface ou enshrined\svgSanitize\data\AttributeInterface.
<use> é permitido por padrão, com limites sobre até onde as referências podem se expandir (useThreshold()) e aninhar (setUseNestingLimit()). Se você não precisar disso, por exemplo porque insere SVG não confiável diretamente em suas páginas, deixe use fora da sua lista de tags permitidas para remover toda essa área.
Você tem a opção de remover atributos que fazem referência a arquivos remotos; isso impedirá vazamentos HTTP, mas adicionará uma sobrecarga ao sanitizador.
O padrão é false; defina como true para remover referências.
$sanitizer->removeRemoteReferences(true);
Quando habilitado, referências remotas também são removidas do CSS dentro de elementos <style> e do CSS em atributos (url(), @import, image-set() e strings entre aspas que começam com uma URL remota). Atributos srcset são removidos por completo, pois contêm uma lista de URLs. Esse tratamento de CSS é de melhor esforço: não é um parser de CSS completo. Trate-o como defesa em profundidade, e não como garantia, e isole o CSS não confiável no ponto em que o SVG é incorporado.
Observação: se um elemento <style> ou atributo style contiver uma referência remota que seja removida, quaisquer sequências de escape de CSS nesse mesmo bloco são normalizadas (decodificadas) na saída. Trata-se de CSS semanticamente idêntico, mas reescreverá escapes escritos manualmente pelo autor.
Você pode usar o método getXmlIssues() para retornar um array de problemas que ocorreram durante a sanitização.
Isso pode ser útil para registro em log ou para fornecer feedback ao usuário sobre por que um SVG foi recusado.
$issues = $sanitizer->getXmlIssues();
A lista contém até 1.000 problemas. Se houver mais, a última entrada informa quantos foram omitidos.
Você pode minificar 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 sanitizar seus uploads no WordPress. Ele 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, disponível em: https://www.drupal.org/project/svg_sanitizer
Esta biblioteca de sanitização de SVG é usada por padrão no núcleo do TYPO3 v9 e versões posteriores. Consulte a entrada correspondente no changelog para mais detalhes.
Você pode executá-los rodando vendor/bin/phpunit a partir do diretório base deste pacote.
Graças ao trabalho de gudmdharalds, agora existe um scanner autônomo que pode ser usado via CLI.
Quaisquer erros serão exibidos no formato JSON. Veja o PR para um exemplo.
Use-o da seguinte forma: php svg-scanner.php ~/svgs/myfile.svg
Testes mais abrangentes para os SVGs/XML seriam ótimos; tentarei adicioná-los em breve. Se você quiser fazer isso por mim, por favor faça e envie um PR!