這是我嘗試用 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 進行更廣泛的測試會很不錯,我會盡快嘗試添加這些。如果你想為我做這件事,請做並做一個公關!