我正在研究提供導入/導出功能的谷歌瀏覽器擴展程序,並試圖執行另存爲...按鈕時遇到了一些問題,因爲我無法強制下載使用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代碼創建的任何可能的安全漏洞才真正有興趣的。
在此先感謝,如有需要我會添加更多信息。
我已經考慮過這個,這就是爲什麼我在考慮將腳本放置在像[Kodingen](http://kodingen.com)這樣的網站上,這樣我的主站點不受影響。由於它基本上限於請求的大小(最大2MB?),所以它不算太壞,但絕對應該看一下。 – Alasdair
另外,我是否正確認爲添加'header('Content-Encoding:gzip');'會正確的GZIP包? – Alasdair
不,你將不得不實際編碼它,我知道的最簡單的方法是使用'if(!ob_start(「ob_gzhandler」)){ob_start(); }'之前回聲和'ob_flush();'之後 – Johan