นี่คือความพยายามของฉันในการสร้าง svg sanitizer ที่เหมาะสมใน PHP งานนี้ยืมมาจาก DOMPurify เป็นส่วนใหญ่
จำเป็นต้องมี enshrined/svg-sanitize
ผ่าน composer หรือดาวน์โหลด repo และรวมวิธีเก่าไว้ด้วย!
การใช้สิ่งนี้ค่อนข้างง่าย สร้างอินสแตนซ์ใหม่ของ enshrinedsvgSanitizeSanitizer
จากนั้นเรียก 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 ที่ผ่านการฆ่าเชื้อแล้วหรือเป็นเท็จบูลี false
หากการแยกวิเคราะห์ XML ล้มเหลว (มักเกิดจากไฟล์ที่มีรูปแบบไม่ดี)
คุณสามารถส่งแท็กและแอตทริบิวต์ไวท์ลิสต์ของคุณเองได้โดยใช้เมธอด Sanitizer::setAllowedTags
และ Sanitizer::setAllowedAttrs
ตามลำดับ
วิธีการเหล่านี้กำหนดให้คุณใช้ enshrinedsvgSanitizedataTagInterface
หรือ enshrinedsvgSanitizedataAttributeInterface
คุณมีตัวเลือกในการลบแอตทริบิวต์ที่อ้างอิงถึงไฟล์ระยะไกล ซึ่งจะหยุดการรั่วไหลของ HTTP แต่จะเพิ่มค่าใช้จ่ายให้กับโปรแกรมฆ่าเชื้อ
ค่าเริ่มต้นนี้เป็นเท็จ ตั้งค่าเป็นจริงเพื่อลบการอ้างอิง
$sanitizer->removeRemoteReferences(true);
คุณสามารถใช้เมธอด getXmlIssues()
เพื่อส่งคืนอาร์เรย์ของปัญหาที่เกิดขึ้นระหว่างการฆ่าเชื้อ
ซึ่งอาจเป็นประโยชน์สำหรับการบันทึกหรือให้ข้อเสนอแนะแก่ผู้ใช้ว่าเหตุใด SVG จึงถูกปฏิเสธ
$issues = $sanitizer->getXmlIssues();
คุณสามารถย่อขนาดเอาต์พุต XML ได้โดยการเรียก $sanitizer->minify(true);
-
มีการสาธิตอยู่ที่: 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 ที่ครอบคลุมมากขึ้นคงจะดีมาก ฉันจะลองเพิ่มการทดสอบเหล่านี้เร็วๆ นี้ ถ้าคุณรู้สึกอยากทำเพื่อฉัน กรุณาทำและประชาสัมพันธ์ด้วย!