PHP

2012-12-20 25 views
7

का उपयोग कर एसवीजी को स्वच्छ करना 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 का उपयोग करके, बाहरी उपकरणों का उपयोग करने वाले किसी भी समाधान के भीतर उपलब्ध होना आवश्यक है वह पारिस्थितिक तंत्र।)

+0

मैंने इस साल की शुरुआत में एक [समान प्रश्न] (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

+0

एक सुरक्षा परिप्रेक्ष्य से, यदि आप संभावित रूप से दबाने वाली एसवीजी फाइलों को संभालने में कामयाब रहे हैं, तो मुख्य बात एक्सएमएल इकाइयों को पट्टी करना है। मुझे नहीं लगता कि वे किसी भी उपयोगी उद्देश्य की सेवा करते हैं, लेकिन [दुर्भावनापूर्ण रूप से इस्तेमाल किया जा सकता है] (http://blog.jondh.me.uk/2012/09/inkscape-xml-entity-vulnerabilities/)। – halfer

+0

@ हेलफर - धन्यवाद, लेकिन डर्न! मैंने आशा की थी कि कोई व्यक्ति 'एसवीजीपुरीफायर' या तुलनीय क्रिसमस चमत्कार प्रकट करने के लिए एक पर्दे वापस खींच देगा। –

उत्तर

2

मैं एक्सएमएल और PHP के साथ काम कर रहा हूं लेकिन मुझे आपके प्रश्न के लिए बिल्कुल यकीन नहीं है। कृपया इसे एक विचार/सुझाव के रूप में लें, और अधिक नहीं।

SimpleXML xml सामग्री लोड करने के लिए libxml का उपयोग करें। SimpleXML साथ अपनी फ़ाइल लोड करने से पहले

libxml_disable_entity_loader (TRUE) 

http://www.php.net/manual/en/function.libxml-disable-entity-loader.php

: http://www.php.net/manual/en/simplexml.requirements.php

आप का उपयोग बाहरी संस्थाओं निष्क्रिय कर सकते हैं।

तो फिर तुम एसवीजी स्कीमा के विरुद्ध सत्यापन सकता

http://us3.php.net/manual/en/domdocument.schemavalidate.php या http://us3.php.net/manual/en/domdocument.validate.php

केवल चिंता का विषय रहा देखना होगा कि svg स्क्रिप्ट तत्व को रख सकती है। http://www.w3.org/TR/SVG/script.html#ScriptElement

वहाँ 1.1 DTD यहाँ के बारे में जानकारी: http://www.w3.org/Graphics/SVG/1.1/DTD/svg-framework.mod http://www.w3.org/TR/2003/REC-SVG11-20030114/REC-SVG11-20030114.pdf

आपने एक संशोधित उपस्थित रहने की स्क्रिप्ट तत्व को रोकने के लिए तत्वों के माध्यम से स्क्रिप्ट तत्व या लूप के संस्करण के साथ एक एसवीजी DTD प्रदान कर सकते हैं।

यह सही नहीं होगा, लेकिन कम से कम कुछ भी बेहतर नहीं होगा।