我正在开发一个提供导入/导出功能的Google Chrome扩展程序,在尝试实施另存为... 按钮时遇到了一些问题,因为我无法强制下载使用JavaScript动态创建的JSON字符串。
我最初想出了以下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代码创建的任何可能的安全漏洞感兴趣。
提前致谢,如果需要,我会添加更多信息。
答案 0 :(得分:1)
嗯,我可以看到的脚本唯一的“风险”是,如果有人不喜欢你,他们可能会一遍又一遍地请求带有大量“内容”的链接,从而耗尽带宽,
无论如何,你可以在某种程度上保护......但我确实怀疑这是不是一个问题。
为了使它变得更加困难,放气或gzip它。使用较小的包装可以加快速度。