2013-02-06 145 views
0

我有以下代码,我使用它来强制下载文件而不是在浏览器中打开。动态设置内容类型

if(isset($_POST['file_name'])){ 
$player_file = $_POST['file_name']; 
$accessKey = "REMOVED"; 
$secretKey = "REMOVED"; 
$bucket = $_POST['bucket']; 
$fname = $_POST['fname']; 

$zip_url = el_s3_getTemporaryZipLink($accessKey, $secretKey, $bucket, $fname); 
$mp3_url = el_s3_getTemporaryMP3Link($accessKey, $secretKey, $bucket, $fname);  


header('Content-type: audio/mpeg3'); 
header('Content-Disposition: attachment; filename="themixtapesite_'.$player_file.'"'); 
readfile($mp3_url); 
exit(); 
} 

正如你所看到的,我通过了一个窗体中的所有变量。然后使用该信息为存储在Amazon S3上的文件生成唯一的Signed URL。

如果文件是MP3,我需要它使用$ mp3_url,如果它是一个Zip文件,我需要使用$ zip_url。

这一定很简单,但我一直坐在这个屏幕前面整天现在我已经有了一个完整的头脑空白!

任何帮助表示赞赏。

+0

创建一个数组控件扩展。检查请求文件的扩展名并据此设置内容类型。 – SachinGutte

+0

依靠扩展内容类型检查是一个坏习惯... – BenM

回答

2
  1. 此代码是一个巨大的安全漏洞。任何愿意使用它的人都可以打开服务器的大门。
  2. 使用array of mime types来确定一个扩展的MIME类型(尽管如此,你需要额外的安全检查,因为仅仅依靠扩展进行中继并不是一件聪明的事情)。
  3. 使用switch语句来确定使用哪个函数。切换后,你应该有$url - 只有一个变量存储扩展名,而不是两个不同的变量。
+0

感谢回复@MarcinWolny。你能否详细说明它的安全性?只是为了澄清使用POST形式提交的信息不是用户输入。它是隐藏的字段,由来自另一页面的变量填充。 –

+2

@BarryJarvis有没有这样的事情,“通过不是用户input_的POST使用表单提交_information”。这是导致网站被黑客入侵的最常见错误之一。虽然我不称它为黑客攻击:它是访问不安全的系统。 **通过POST或GET发送的任何数据都可以通过任何具有一点网站管理经验的人轻易修改**。您的安全缺陷是您认为POST数据甚至是远程安全或可预测的。不是。 – MarcinWolny

+0

我使用的表单是下载文件,我使用表单的原因是为了将直接url隐藏到文件中。我用带有必要信息的变量填充表单。有没有更好的方法来强制下载文件,而不是通过表单传递信息并设置标题?我对PHP很陌生,所以我可能会犯这本书中的所有错误! * P.S。我更新的代码,以反映变化我它使...通过我的访问密钥通过形式肯定是不明智之举!* –