2012-12-20 20 views
7

私は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要素がデータをPOSTするために使用される隠れた形態である。

<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)があります。結果の新しいファイルがブラウザに戻され、一時ファイルが削除されます:私はconverting the SVG to a PNG using JavaScript (canvg(), then toDataURL, then document.write)を調査してきた、とPNG画像を生成するためにこれを使用すること

// headers etc generated - omitted for brevity 
readfile($outfile); 

unlink($infile); // delete temporary infile 
unlink($outfile); // delete temporary outfile 

が、それは、PDFへの変換はできません。

So: ファイルに書き込む前に、conversion.phpに提供されているSVGデータを、どのようにして最善の状態で浄化したりフィルタリングしたりできますか? SVGのサニタイズの現在の状態は何ですか? PHPの中で何が使えますか?私はwhitelist-based approachと一緒にconversion.phpに提供されたSVGデータをサニタイズするか、それとも良い方法がありますか?

(私はそれを学ぶことができますが、私はそれを学ぶことができますが、私は可能な限りPHP内で墨塗りを保つことを望んでいます。Windows Server 2008を使用するので、外部ツールを使用するソリューションは、そのエコシステム)

+0

今年初めに[類似の質問](http://stackoverflow.com/questions/9654664/security-implications-of-letting-users-render-own-svg-files)に尋ねましたが、多くの咬傷。 1.2を使用していない場合(またはInkscapeドキュメントごとに任意の拡張子)、1.1仕様に対して検証できます。他の[質問はこちら](http://stackoverflow.com/questions/9651493/validating-svg-file)を参照してください。 -in-php-with-xmlreader)を実行します。 – halfer

+0

セキュリティ上の観点から、潜在的に汚染されたSVGファイルを処理する場合、主なことはXMLエンティティを削除することです。私は彼らが有用な目的を果たしているとは思っていませんが、悪意を持って使用することができます(http://blog.jondh.me.uk/2012/09/inkscape-xml-entity-vulnerabilities/)。 – halfer

+0

@halfer - ありがとうございます。私は誰かが 'SVGpurifier'やそれに類するクリスマスの奇跡を明らかにするためにカーテンを引っ張ることを望んでいました。 –

答えて

2

私はxmlとPHPで作業していますが、私はあなたの質問については全くわかりません。それをアイデアや提案としてください。

SimpleXML xmlコンテンツを読み込むためにlibxmlを使用します。 http://www.php.net/manual/en/simplexml.requirements.php

あなたは使用して外部エンティティを無効にすることができます

libxml_disable_entity_loader (TRUE) 

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

をSimpleXMLをして、あなたのファイルを読み込む前。私が見るであろう

その後、あなたはSVGスキーマに対して検証でき

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

あなたが存在することがscript要素を防ぐために、要素をscript要素やループの修正版でSVG DTDを提供するかもしれません。

これは完璧ではありませんが、少なくとも何もないより優れています。

関連する問題