2011-08-01 49 views
1

我正在研究提供導入/導出功能的谷歌瀏覽器擴展程序,並試圖執行另存爲...按鈕時遇到了一些問題,因爲我無法強制下載使用JavaScript動態創建的JSON字符串。PHP可能存在的安全問題

我最初想出了以下JavaScript解決方案;

$('#saveAsButton').live('click', function (event) { 
    var str = JSON.stringify('{}'); 
    window.location = 'data:text/json;charset=utf8,' + encodeURIComponent(str); 
}); 

但是,我不能提出一個文件名,甚至擴展到用戶爲他們保存爲它依賴於模擬MIME text/json總是需要下載。

爲了解決這個問題,我打算在我的服務器上創建一個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; 

?> 

我包裹另存爲...在form元素按鈕將調用此遠程PHP代碼,但我已經修改了原來的監聽,以支持「離線」模式。

$('#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

不,你將不得不實際編碼它,我知道的最簡單的方法是使用'if(!ob_start(「ob_gzhandler」)){ob_start(); }'之前回聲和'ob_flush();'之後 – Johan