
PHP लाइब्रेरी जो अपलोड किए गए या इनलाइन किए गए SVG फ़ाइलों में XSS और स्क्रिप्ट इंजेक्शन को रोकने के लिए टैग, विशेषताओं और रिमोट संदर्भों को फ़िल्टर करके अविश्वसनीय SVG/XML को सैनिटाइज़ करती है।
यह PHP में एक उचित SVG सैनिटाइज़र बनाने का मेरा प्रयास है। यह कार्य काफी हद तक DOMPurify से लिया गया है।
या तो composer के माध्यम से enshrined/svg-sanitize को require करें या रेपो डाउनलोड करके पुराने तरीके से include करें!
इसका उपयोग करना काफी आसान है। enshrined\svgSanitize\Sanitizer का एक नया इंस्टेंस बनाएं और फिर अपने असुरक्षित 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 स्ट्रिंग लौटाएगा या बूलियन false यदि XML पार्सिंग विफल रही (आमतौर पर खराब फ़ॉर्मेटेड फ़ाइल के कारण)।
यह उन इनपुट के लिए भी false लौटाता है जिन्हें यह XML पार्सर को नहीं सौंपेगा:
<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);
सक्षम होने पर, रिमोट संदर्भ <style> एलिमेंट्स के अंदर CSS से और विशेषताओं में CSS से भी हटा दिए जाते हैं (url(), @import, image-set(), और रिमोट URL से शुरू होने वाले उद्धृत स्ट्रिंग्स)। srcset विशेषताएँ पूरी तरह से हटा दी जाती हैं, क्योंकि उनमें URL की सूची होती है। यह CSS प्रबंधन सर्वोत्तम-प्रयास है: यह पूर्ण CSS पार्सर नहीं है। इसे गारंटी के बजाय गहन-रक्षा के रूप में मानें, और अविश्वसनीय CSS को उस बिंदु पर अलग करें जहाँ SVG एम्बेड किया गया है।
नोट: यदि किसी <style> एलिमेंट या style विशेषता में कोई रिमोट संदर्भ है जो हटा दिया जाता है, तो उसी ब्लॉक में कोई भी CSS एस्केप अनुक्रम आउटपुट में सामान्यीकृत (डिकोड) कर दिए जाते हैं। यह अर्थपूर्ण रूप से समान CSS है लेकिन लेखक द्वारा हाथ से लिखे गए एस्केप को फिर से लिख देगा।
आप सैनिटाइज़ेशन के दौरान हुई समस्याओं की एक सरणी लौटाने के लिए getXmlIssues() विधि का उपयोग कर सकते हैं।
यह लॉगिंग के लिए या उपयोगकर्ता को यह प्रतिक्रिया देने के लिए उपयोगी हो सकता है कि किसी SVG को क्यों अस्वीकार किया गया।
$issues = $sanitizer->getXmlIssues();
सूची में अधिकतम 1,000 समस्याएँ होती हैं। यदि अधिक हैं, तो अंतिम प्रविष्टि बताती है कि कितनी छोड़ी गईं।
आप $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 सैनिटाइज़र लाइब्रेरी TYPO3 v9 और बाद के संस्करणों के कोर में डिफ़ॉल्ट रूप से उपयोग की जाती है। अधिक जानकारी के लिए संबंधित चेंजलॉग प्रविष्टि देखें।
आप इन्हें इस पैकेज की आधार निर्देशिका से vendor/bin/phpunit चलाकर चला सकते हैं।
gudmdharalds के काम के लिए धन्यवाद, अब एक स्टैंडअलोन स्कैनर है जिसका उपयोग CLI के माध्यम से किया जा सकता है।
कोई भी त्रुटि JSON प्रारूप में आउटपुट होगी। उदाहरण के लिए PR देखें।
इसका उपयोग इस प्रकार करें: php svg-scanner.php ~/svgs/myfile.svg
SVGs/XML के लिए अधिक व्यापक परीक्षण अच्छा रहेगा, मैं जल्द ही इन्हें जोड़ने का प्रयास करूँगा। यदि आप मेरे लिए ऐसा करना चाहें, तो कृपया करें और एक PR बनाएँ!