का उपयोग कर एसवीजी को स्वच्छ करना I d3.js. का उपयोग कर एसवीजी के रूप में फ्लाई पर चार्ट बना रहा हूं। ये चार्ट प्रमाणीकृत उपयोगकर्ताओं के चयन के आधार पर गतिशील रूप से जेनरेट किए जाते हैं। एक बार ये चार्ट उत्पन्न हो जाने के बाद, उपयोगकर्ता को पीएनजी या पीडीएफ के रूप में जेनरेट किए गए एसवीजी को डाउनलोड करने का विकल्प होता है।PHP
वर्तमान कार्यप्रवाह है निम्नलिखित:
<form id="svgform" method="post" action="conversion.php">
<input type="hidden" id="output_format" name="output_format" value="">
<input type="hidden" id="data" name="data" value="">
</form>
PHP फ़ाइल एक अस्थायी रूप में प्रदान की एसवीजी डेटा की बचत होती है:
// JAVASC
// get the element containing generated SVG
var svg = document.getElementById("chart-container");
// Extract the data as SVG text string
var svg_xml = (new XMLSerializer).serializeToString(svg);
// Submit the <FORM> to the server.
var form = document.getElementById("svgform");
form['output_format'].value = output_format; // can be either "pdf" or "png"
form['data'].value = svg_xml ;
form.submit();
फार्म तत्व एक गुप्त फ़ॉर्म, डेटा पोस्ट करने के लिए प्रयोग किया जाता है फ़ाइल:
// check for valid session, etc - omitted for brevity
$xmldat = $_POST['data']; // serialized XML representing the SVG element
if(simplexml_load_string($xmldat)===FALSE) { die; } // reject invalid XML
$fileformat = $_POST['output_format']; // chosen format for output; PNG or PDF
if ($fileformat != "pdf" && $fileformat != "png"){ die; } // limited options for format
$fileformat = escapeshellarg($fileformat); // escape shell arguments that might have snuck in
// generate temporary file names with tempnam() - omitted for brevity
$handle = fopen($infile, "w");
fwrite($handle, $xmldat);
fclose($handle);
एक रूपांतरण उपयोगिता चलती है जो अस्थायी फ़ाइल ($ infile) और रचना को पढ़ती है निर्दिष्ट $ fileformat (पीडीएफ या पीएनजी) में एक नई फ़ाइल ($ outfile) es। जिसके परिणामस्वरूप नई फ़ाइल तो ब्राउज़र में लौट आता है, और अस्थायी फ़ाइलों को हटा दी जाती हैं:
// headers etc generated - omitted for brevity
readfile($outfile);
unlink($infile); // delete temporary infile
unlink($outfile); // delete temporary outfile
मैं converting the SVG to a PNG using JavaScript (canvg(), then toDataURL, then document.write) की जांच की है, और PNG का पैदा करने के लिए इसका उपयोग कर सकते हैं, लेकिन यह पीडीएफ के लिए रूपांतरण के लिए अनुमति नहीं है।
तो: मैं किसी फ़ाइल में लिखे जाने से पहले रूपांतरण.एफ़पी को प्रदान किए गए एसवीजी डेटा को सबसे अच्छी तरह से स्वच्छ या फ़िल्टर कैसे कर सकता हूं? एसवीजी स्वच्छता की वर्तमान स्थिति क्या है? PHP के भीतर क्या उपलब्ध है? क्या मुझे रूपांतरण.एफ़पी को प्रदान किए गए एसवीजी डेटा को स्वच्छ करने के लिए whitelist-based approach के साथ जाना चाहिए, या क्या कोई बेहतर तरीका है?
(मुझे एक्सएसएलटी नहीं पता है, हालांकि मैं इसे सीखने की कोशिश कर सकता हूं; मुझे आशा है कि जितना संभव हो सके PHP के भीतर स्वच्छता को बनाए रखें। विंडोज सर्वर 2008 का उपयोग करके, बाहरी उपकरणों का उपयोग करने वाले किसी भी समाधान के भीतर उपलब्ध होना आवश्यक है वह पारिस्थितिक तंत्र।)
मैंने इस साल की शुरुआत में एक [समान प्रश्न] (http://stackoverflow.com/questions/9654664/security-implications-of-letting-users-render-own-svg-files) से पूछा, लेकिन नहीं मिला कई काटने यदि आप 1.2 का उपयोग नहीं कर रहे हैं (या इनक्सस्केप दस्तावेज़ के अनुसार कोई एक्सटेंशन) का उपयोग नहीं कर रहे हैं, तो आप 1.1 spec के खिलाफ मान्य कर सकते हैं, मेरा अन्य [यहां प्रश्न] देखें (http://stackoverflow.com/questions/9651493/validating-svg-file -इन-php-साथ-XmlReader)। – halfer
एक सुरक्षा परिप्रेक्ष्य से, यदि आप संभावित रूप से दबाने वाली एसवीजी फाइलों को संभालने में कामयाब रहे हैं, तो मुख्य बात एक्सएमएल इकाइयों को पट्टी करना है। मुझे नहीं लगता कि वे किसी भी उपयोगी उद्देश्य की सेवा करते हैं, लेकिन [दुर्भावनापूर्ण रूप से इस्तेमाल किया जा सकता है] (http://blog.jondh.me.uk/2012/09/inkscape-xml-entity-vulnerabilities/)। – halfer
@ हेलफर - धन्यवाद, लेकिन डर्न! मैंने आशा की थी कि कोई व्यक्ति 'एसवीजीपुरीफायर' या तुलनीय क्रिसमस चमत्कार प्रकट करने के लिए एक पर्दे वापस खींच देगा। –