Sanificazione SVG con PHP

Sto creando grafici al volo come SVG usando d3.js. Questi grafici sono generati dynamicmente in base alle selezioni di utenti autenticati. Una volta generati questi grafici, l'utente ha la possibilità di scaricare l'SVG generato come PNG o PDF.

Il stream di lavoro corrente è il seguente:

// 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(); 

L'elemento FORM è un module nascosto, utilizzato per POST i dati:

 <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> 

Il file PHP salva i dati SVG forniti come un file temporaneo:

 // 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); 

Viene eseguita un'utilità di conversione che legge il file temporaneo ($ infile) e crea un nuovo file ($ outfile) nel $ fileformat specificato (PDF o PNG). Il nuovo file risultante viene quindi restituito al browser e i file temporanei vengono cancellati:

 // headers etc generated - omitted for brevity readfile($outfile); unlink($infile); // delete temporary infile unlink($outfile); // delete temporary outfile 

Ho studiato la conversione dell'SVG in PNG utilizzando JavaScript (canvg (), quindi in data_DURL, quindi document.write) , e potrei usarlo per generare i file PNG, ma non consentire la conversione in PDF.

Quindi: come posso disinfettare o filtrare al meglio i dati SVG forniti a conversion.php, prima che vengano scritti su un file? Qual è lo stato attuale della sanitizzazione SVG? Cosa c'è in PHP? Devo andare con un approccio basato su whitelist per disinfettare i dati SVG forniti a conversion.php, o c'è un modo migliore?

(Non conosco XSLT, anche se potrei provare a impararlo, spero di mantenere il più ansible la sanificazione all'interno di PHP. Con Windows Server 2008, quindi, tutte le soluzioni che utilizzano strumenti esterni dovrebbero essere disponibili all'interno di quell'ecosistema.)

Sto lavorando con xml e PHP ma non sono sicuro per la tua domanda. Per favore prendilo come idea / suggerimento, non di più.

SimpleXML usa libxml per caricare il contenuto xml. http://www.php.net/manual/en/simplexml.requirements.php

Puoi disabilitare le entity framework; esterne usando:

 libxml_disable_entity_loader (TRUE) 

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

prima di caricare il file con simpleXML.

Quindi è ansible validare lo schema SVG

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

L'unica preoccupazione che vedrei è che svg potrebbe contenere elementi di script. http://www.w3.org/TR/SVG/script.html#ScriptElement

Ci sono informazioni su 1.1 DTD qui: 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

È ansible fornire una DTD SVG con una versione modificata dell'elemento di script o un ciclo degli elementi per impedire la presenza dell'elemento di script.

Non sarà perfetto, ma alless meglio di niente.