これは、PHP でまともなsvg sanitizerを構築するという私の試みです。この作品の大部分は DOMPurify から借用しています。
Composer を通じて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
これにより、サニタイズされた SVG/XML 文字列が返されるか、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 から入手できます。
このsvg sanitizerライブラリは、TYPO3 v9 以降のバージョンのコアでデフォルトで使用されます。詳細については、対応する変更ログ エントリを参照してください。
これらを実行するには、このパッケージのベース ディレクトリからvendor/bin/phpunit
実行します。
gudmdharalds の取り組みのおかげで、CLI 経由で使用できるスタンドアロン スキャナが提供されました。
エラーはすべて JSON 形式で出力されます。例については PR を参照してください。
次のように使用します: php svg-scanner.php ~/svgs/myfile.svg
SVG/XML のさらに広範なテストができれば素晴らしいと思います。すぐに追加してみます。やってみたいと思ったらぜひPRしてください!