这是我尝试用 PHP 构建一个像样的svg sanitizer 。这项工作主要借鉴自 DOMPurify。
要么需要通过作曲家enshrined/svg-sanitize
要么下载存储库并包含旧方法!
使用这个相当容易。创建enshrinedsvgSanitizeSanitizer
的新实例,然后在传递脏 SVG/XML 时调用sanitize
基本示例
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
如果 XML 解析失败(通常是由于格式错误的文件),这将返回经过清理的 SVG/XML 字符串或布尔值false
。
您可以分别使用Sanitizer::setAllowedTags
和Sanitizer::setAllowedAttrs
方法传递自己的标签和属性白名单。
这些方法要求您实现enshrinedsvgSanitizedataTagInterface
或enshrinedsvgSanitizedataAttributeInterface
。
您可以选择删除引用远程文件的属性,这将阻止 HTTP 泄漏,但会增加清理程序的开销。
默认为 false,设置为 true 可删除引用。
$sanitizer->removeRemoteReferences(true);
您可以使用getXmlIssues()
方法返回清理期间发生的问题的数组。
这对于记录 SVG 被拒绝的原因或向用户提供反馈可能很有用。
$issues = $sanitizer->getXmlIssues();
您可以通过调用$sanitizer->minify(true);
来缩小 XML 输出。 。
有一个演示:http://svg.enshrined.co.uk/
我刚刚发布了一个包含此代码的 WordPress 插件,以便您可以清理您的 WordPress 上传内容。它可以从 WordPress 插件目录获取:https://wordpress.org/plugins/safe-svg/
Michael Potter 为该库创建了一个 Drupal 模块,可从以下网址获取:https://www.drupal.org/project/svg_sanitizer
TYPO3 v9 及更高版本的核心默认使用此svg sanitizer库。有关更多详细信息,请参阅相应的变更日志条目。
您可以通过从该包的基目录运行vendor/bin/phpunit
来运行它们。
感谢 gudmdharalds 的工作,现在有了一个可以通过 CLI 使用的独立扫描仪。
任何错误都将以 JSON 格式输出。请参阅 PR 的示例。
使用方法如下: php svg-scanner.php ~/svgs/myfile.svg
对 SVG/XML 进行更广泛的测试会很不错,我会尽快尝试添加这些。如果你想为我做这件事,请做并做一个公关!