我已经多次看到这个问题了,但它必须对可以强制下载的代码做很多事情,而且我认为我没有发现可能出现的“安全”问题。我希望人们在登录后下载内容(以防止热链接)。 我试图用htaccess和PHP来兼顾这个问题。 PHP文件检查登录,我也有OpenId(某事)。下载部分如下:
$url = "{$_SERVER['DOCUMENT_ROOT']}/myfolder/{$myfile}";
if(!is_file($url)) {
//whatever
}elseif (is_file($url)){
switch($url['extension']) {
case 'pdf': $ext = 'application/pdf'; break;
case 'zip': $ext = 'application/zip'; break;
case 'pps': $ext = 'application/vnd.ms-powerpoint'; break;
case 'pptx': $ext = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'; break;
case 'docx': $ext = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'; break;
default: $ext = 'application/force-download';
}
header('Pragma: public');
header('Expires: 0');
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private',false);
header('Content-Type: '.$ext);
header('Content-Disposition: attachment; filename="'.basename($url).'"');
header('Content-Transfer-Encoding: binary');
header('Connection: close');
readfile($url);
exit();
}
Myfolder
受到htaccess的保护,拒绝所有人。
我不确定这是否足够安全,所以在我做一些非常不安全的事情之前我会问。我已经读过人们可以下载“你的宝贵脚本”,但我不知道(据我所知,PHP是不可下载的)。你认为我有严重的漏洞,除了XSS,顺便说一句,它在该页面的某个地方处理?
提前谢谢。
答案 0 :(得分:1)
正如评论中已经提到的那样,在使用echo
发送内容后,您无法发送标题。
另外:确保清理用于生成文件路径的$myfile
var,然后使用realpath
仔细检查生成的路径是否在“允许”路径列表中。否则,某人可能会传递../../../supersecret/file
这样的内容,而您却遇到了麻烦。