我创建了这个应用程序,它从数据库中的给定列表创建一个 csv 文件,然后允许用户下载它!当我完成工作时,我意识到存在安全问题!
这是我用来发出请求的ajas:
$.ajax({
type: "POST",
url:HTTPS + '/lib/model/data/ctlRates.php?export=1',
data: {
ext: ext,
filter: filter,
fileName: fileName
},
dataType: 'json',
success: function(data){
if(data['results'] == "success"){
console.log(data['results']);
var filename = data['filename'];
var extension = data['ext'];
window.location = HTTPS + '/lib/model/data/ctlRates.php download=1&filename='+filename+'&ext='+extension;
} else {
console.log(data['results']);
}
}
});
} else {
alert("Error: File name and extension must be provided");
}
});
我想你们中的大多数人已经看到了这个问题!
但这里是 window.location 指向的控制器:
if(isset($_GET['download']) && $_GET['download'] == 1){
$filePath = "/path/to/file/dir";
$name = $_GET['filename'];
$extension = $_GET['ext'];
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header('Content-Description: File Transfer');
header('Content-type: text/'.$extension.'');
header('Content-Disposition: attachment; filename="'.$name.".".$extension.'');
header("Content-Transfer-Encoding: binary");
header("Pragma: public");
ob_clean();
flush();
readfile($filePath.$name.".".$extension);
}
开始测试并开始意识到每个人都可以提供他们喜欢的文件名和扩展名并从该目录获取文件....任何想法如何埋葬这个洞?