私は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を使用するので、外部ツールを使用するソリューションは、そのエコシステム)
今年初めに[類似の質問](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
セキュリティ上の観点から、潜在的に汚染されたSVGファイルを処理する場合、主なことはXMLエンティティを削除することです。私は彼らが有用な目的を果たしているとは思っていませんが、悪意を持って使用することができます(http://blog.jondh.me.uk/2012/09/inkscape-xml-entity-vulnerabilities/)。 – halfer
@halfer - ありがとうございます。私は誰かが 'SVGpurifier'やそれに類するクリスマスの奇跡を明らかにするためにカーテンを引っ張ることを望んでいました。 –