enshrined/svg-sanitize

PHP SVG 清洗器

0.20.0 2024-09-05 10:18 UTC

README

Build Status Test Coverage

这是我尝试在PHP中构建一个不错的SVG清洗器的努力。这项工作大部分借鉴自 DOMPurify

安装

通过composer要求 enshrined/svg-sanitize 或下载仓库并按旧方式包含!

用法

使用这个库相当简单。创建一个新的 enshrined\svgSanitize\Sanitizer 实例,然后调用 sanitize 方法并传入你的脏 SVG/XML。

基本示例

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

输出

这将返回一个清洗后的 SVG/XML 字符串,或者在 XML 解析失败(通常是由于文件格式不正确)时返回布尔值 false

选项

您可以使用 Sanitizer::setAllowedTagsSanitizer::setAllowedAttrs 方法分别传递自己的标签和属性白名单。

这些方法要求您实现 enshrined\svgSanitize\data\TagInterfaceenshrined\svgSanitize\data\AttributeInterface

移除远程引用

您可以选择移除引用远程文件的属性,这将阻止HTTP泄露,但会增加清洗器的开销。

默认为false,设置为true以移除引用。

$sanitizer->removeRemoteReferences(true);

查看清洗问题

您可以使用 getXmlIssues() 方法返回在清洗过程中发生的问题数组。

这可能有助于记录或向用户反馈为什么拒绝SVG的原因。

$issues = $sanitizer->getXmlIssues();

最小化

您可以通过调用 $sanitizer->minify(true); 来最小化 XML 输出。

演示

演示可用于此: http://svg.enshrined.co.uk/

WordPress

我刚刚发布了一个包含此代码的 WordPress 插件,以便您可以清洗 WordPress 上传的文件。它可在 WordPress 插件目录中找到: https://wordpress.org/plugins/safe-svg/

Drupal

Michael Potter 慷慨地为这个库创建了一个 Drupal 模块,可在以下位置找到: https://www.drupal.org/project/svg_sanitizer

TYPO3

此 SVG 清洗器库是TYPO3 v9及以后版本核心默认使用的。有关详细信息,请参阅 相应的变更日志条目

测试

您可以从此包的基本目录中运行 vendor/bin/phpunit 来运行这些测试。

通过CLI独立扫描文件

感谢 gudmdharalds 的努力,现在有一个可以用于CLI的独立扫描器。

任何错误将以JSON格式输出。请参阅 PR示例

使用方法如下: php svg-scanner.php ~/svgs/myfile.svg

待办事项

对于SVGs/XML进行更广泛的测试将很棒,我会尽快添加这些。如果你愿意帮我做这件事,请动手做,并创建一个Pull Request!