2011-08-01 38 views
1

インポート/エクスポート機能を提供する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コードによって作成されたすべての可能なセキュリティの脆弱性の唯一の本当に興味があります。

事前のおかげで、必要であれば、私は、さらに情報を追加します。

答えて

1

まあ、私は見ることができますあなたのスクリプトにのみ「リスク」は、誰かがあなたを好きではない場合、彼らはあなたの帯域幅を排出、何度も何度も、大規模のコンテンツ 'でリンクを要求することができるということである

あなたはそれを保護することができます...とにかく拡張するものもありますが、それが問題になるのであれば疑いがあります。

、しかし、それはより困難に収縮させるか、またはそれをgzip圧縮します。より小さなパッケージでより速くなります。

+0

私は私が私のメインのサイトが影響を受けているように、[Kodingen](http://kodingen.com)のようなサイトにスクリプトを置く熟考だ理由である。この検討しています。基本的に要求のサイズ(最大2MB?)に制限されているので、それほど悪くはありませんが、間違いなく見てください。 – Alasdair

+0

また、 'header( 'Content-Encoding:gzip');を追加すると、パッケージを正しくGZIPできますか? – Alasdair

+0

いいえ、あなたはactualyそれをエンコードする必要がありますが、私が知っている最も簡単な方法は、(!のob_start( "ob_gzhandlerを"))場合は 'を使用することで、{のob_start(); } 'エコーの前に' ob_flush(); 'その後 – Johan

関連する問題