我正在使用d3.js創建圖表作爲SVG使用。這些圖表是根據經過驗證的用戶的選擇動態生成的。生成這些圖表後,用戶可以選擇將生成的SVG作爲PNG或PDF格式下載。使用PHP消毒SVG
當前工作流程如下:
// 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();
形式元件是一個隱藏的形式,用於發佈所述數據:
<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的文件保存所提供的SVG數據作爲臨時文件:
// 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)和creat指定$ fileformat(PDF或PNG)中的新文件($ outfile)。然後將得到的新文件返回給瀏覽器,而臨時文件被刪除:
// 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格式,但它不允許轉換爲PDF。
因此: 在將數據寫入文件之前,如何最好地淨化或過濾提供給conversion.php的SVG數據? SVG消毒的現狀是什麼? PHP中有什麼可用的?我是否應該使用whitelist-based approach來清除提供給conversion.php的SVG數據,或者有更好的方法嗎?我不知道XSLT,儘管我可以嘗試去學習它;我希望儘可能在PHP中保留消毒。使用Windows Server 2008,所以任何使用外部工具的解決方案都需要在內部提供那個生態系統)。
我今年早些時候問[類似的問題(http://stackoverflow.com/questions/9654664/security-implications-of-letting-users-render-own-svg-files),但沒有得到許多叮咬。你可以驗證對1.1規範,如果你不使用1.2(或任何擴展爲每一個Inkscape的文檔),請參閱我的其他[此問題](http://stackoverflow.com/questions/9651493/validating-svg-file -in-PHP-與-的XMLReader)。 – halfer
從安全的角度來看,如果你正在處理潛在的感染SVG文件,更主要的是剝離XML實體。我不認爲他們有任何用處,但[可以被惡意使用(http://blog.jondh.me.uk/2012/09/inkscape-xml-entity-vulnerabilities/)。 – halfer
@halfer - 謝謝,但是darn!我曾希望有人會拉開帷幕揭露'SVGpurifier'或類似的聖誕奇蹟。 –