
مكتبة PHP تعقّم ملفات SVG/XML غير الموثوقة عبر تصفية الوسوم والسمات والمراجع البعيدة لمنع XSS وحقن النصوص البرمجية في ملفات SVG المرفوعة أو المضمّنة.
هذه محاولتي لبناء أداة تعقيم SVG جيدة بلغة PHP. العمل مستعار إلى حد كبير من DOMPurify.
إما أن تطلب enshrined/svg-sanitize عبر composer أو تنزّل المستودع وتضمّنه بالطريقة القديمة!
استخدام هذه الأداة سهل للغاية. أنشئ نسخة جديدة من 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 مُنقّاة أو القيمة المنطقية false إذا فشل تحليل XML (عادةً بسبب ملف سيئ التنسيق).
كما يُرجع false للمدخلات التي لن يمررها إلى محلل XML:
<svg> في مساحة أسماء غير SVGيوضح getXmlIssues() السبب.
يمكنك تمرير قائمة السماح الخاصة بك من الوسوم والسمات باستخدام طريقتي Sanitizer::setAllowedTags وSanitizer::setAllowedAttrs على التوالي.
تتطلب هذه الطرق أن تنفّذ enshrined\svgSanitize\data\TagInterface أو enshrined\svgSanitize\data\AttributeInterface.
يُسمح بـ <use> افتراضيًا، مع حدود على مدى توسّع المراجع (useThreshold()) وتعشيشها (setUseNestingLimit()). إذا لم تكن بحاجة إليه، على سبيل المثال لأنك تُضمّن SVG غير موثوق مباشرةً في صفحاتك، فاترك use خارج قائمة السماح بالوسوم لإزالة هذا المجال بالكامل.
لديك خيار إزالة السمات التي تشير إلى ملفات بعيدة، وهذا سيمنع تسريبات HTTP لكنه سيضيف عبئًا إضافيًا على المنقّي.
القيمة الافتراضية هي false، اضبطها على true لإزالة المراجع.
$sanitizer->removeRemoteReferences(true);
عند التفعيل، تُزال أيضًا المراجع البعيدة من CSS داخل عناصر <style> ومن CSS في السمات (url()، و@import، وimage-set()، والسلاسل المقتبسة التي تبدأ بعنوان URL بعيد). تُزال سمات srcset بالكامل، لأنها تحتوي على قائمة من عناوين URL. هذه المعالجة لـ CSS هي بأفضل جهد ممكن: فهي ليست محلل CSS كاملًا. تعامل معها كدفاع متعدد الطبقات بدلًا من ضمان، واعزل CSS غير الموثوق عند النقطة التي يُضمَّن فيها SVG.
ملاحظة: إذا كان عنصر <style> أو سمة style يحتوي على مرجع بعيد تتم إزالته، فسيتم تطبيع (فك ترميز) أي تسلسلات هروب CSS في نفس الكتلة في المخرجات. هذا CSS متطابق دلاليًا لكنه سيعيد كتابة تسلسلات الهروب التي كتبها المؤلف يدويًا.
يمكنك استخدام طريقة getXmlIssues() لإرجاع مصفوفة بالمشكلات التي حدثت أثناء التنقية.
قد يكون هذا مفيدًا للتسجيل أو لتقديم ملاحظات للمستخدم حول سبب رفض SVG.
$issues = $sanitizer->getXmlIssues();
تحتوي القائمة على ما يصل إلى 1,000 مشكلة. إذا كان هناك المزيد، فسيوضح الإدخال الأخير عدد المشكلات التي تم استبعادها.
يمكنك تصغير مخرجات 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 هذه افتراضيًا في نواة TYPO3 الإصدار v9 والإصدارات اللاحقة. راجع إدخال سجل التغييرات المقابل لمزيد من التفاصيل.
يمكنك تشغيلها بتنفيذ vendor/bin/phpunit من الدليل الأساسي لهذه الحزمة.
بفضل عمل gudmdharalds أصبح هناك الآن ماسح مستقل يمكن استخدامه عبر CLI.
ستُخرَج أي أخطاء بصيغة JSON. راجع الـ PR للحصول على مثال.
استخدمه كما يلي: php svg-scanner.php ~/svgs/myfile.svg
سيكون من الرائع إجراء اختبارات أكثر شمولًا لملفات SVGs/XML، وسأحاول إضافة هذه قريبًا. إذا كنت ترغب في القيام بذلك نيابةً عني، فالرجاء فعل ذلك وقدّم PR!