インポート/エクスポート機能を提供するGoogle Chrome拡張機能を使用していますが、名前を付けて保存するときにいくつかの問題が発生しました...ボタンは強制的にダウンロードできませんでしたJavaScriptを使用して動的に作成されたJSON文字列のPHPでセキュリティ上の問題が発生する可能性があります
私はもともと次のJavaScriptの解決策を考え出しました。そしてそれは常にダウンロードを必要とする模擬MIME text/json
に依存しているとして、彼らはそれを保存するため
$('#saveAsButton').live('click', function (event) {
var str = JSON.stringify('{}');
window.location = 'data:text/json;charset=utf8,' + encodeURIComponent(str);
});
しかし、私は、ユーザーにファイル名、あるいは拡張子を提案することはできません。
はこれを解決するために、私は、に投稿された、私のサーバー上の単一のPHPスクリプトを作成することを計画しています単に提供する文字列のダウンロードを強制します。しかし、私のPHPの知識(特にセキュリティに関する)は素晴らしいことではないので、次のコードでセキュリティ上の懸念があるかどうか疑問に思っていました。
<?php
$category = strtolower(urldecode($_POST['category']));
$content = urldecode($_POST['content']);
switch ($category) {
case 'json':
$contentType = 'text/json; charset=utf-8';
$fileExtension = 'json';
break;
default:
$contentType = 'text/plain; charset=utf-8';
$fileExtension = 'txt';
}
header('Cache-Control: public');
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename=export.' . $fileExtension);
header('Content-Type: ' . $contentType);
print $content;
?>
私は名前を付けて保存...このリモートPHPコードを呼び出しますが、私は「オフライン」モードをサポートするために、元のリスナーを変更したform
要素でボタンを包みました。
$('#saveAsButton').live('click', function (event) {
var str = JSON.stringify('{}'); // Simplified for purpose of example
if (window.navigator.onLine) {
$(this).parents('form').first().find('input[name="content"]').val(str);
} else {
// Fall back on "ugly" method
window.location = 'data:text/json;charset=utf8,' + encodeURIComponent(str);
event.preventDefault();
}
});
PHPとJavaScriptのすべてが機能して述べたように、私は、とても結果に満足している、私はPHPコードによって作成されたすべての可能なセキュリティの脆弱性の唯一の本当に興味があります。
事前のおかげで、必要であれば、私は、さらに情報を追加します。
私は私が私のメインのサイトが影響を受けているように、[Kodingen](http://kodingen.com)のようなサイトにスクリプトを置く熟考だ理由である。この検討しています。基本的に要求のサイズ(最大2MB?)に制限されているので、それほど悪くはありませんが、間違いなく見てください。 – Alasdair
また、 'header( 'Content-Encoding:gzip');を追加すると、パッケージを正しくGZIPできますか? – Alasdair
いいえ、あなたはactualyそれをエンコードする必要がありますが、私が知っている最も簡単な方法は、(!のob_start( "ob_gzhandlerを"))場合は 'を使用することで、{のob_start(); } 'エコーの前に' ob_flush(); 'その後 – Johan