2010-06-20 106 views
4

我正在使用Flash播放器播放一些mp3文件。在Firefox中,它正常加载它们,但在IE中它没有。当我转到.mp3文件的url时,它显示了mp3的源代码(而不是提供例如下载)。所以我用一个小脚本来修复它:Php readfile - 强制下载

$url = $_GET['url']; 
header('Content-type: application/force-download'); 
header('Content-Transfer-Encoding: Binary'); 
header("Content-disposition: attachment; filename=demo.mp3"); 
readfile($url); 

我想问问你以上是否安全。而且,服务器通过这种方式损失带宽吗?最后,它会影响服务器的资源吗? 谢谢。

回答

9

不,这不安全。如果您的数据库密码为database.php,并且我输入database.php$_GET['url'],那么您的脚本会向我发送该密码的PHP文件。

是的,这会占用带宽和一些服务器资源。

+0

那么......那么,谢谢! – Manolis 2010-06-20 14:39:36

5

这是不安全的,它不应该是必要的这样做。

除了安全隐患@ceejayoz概述,如果启用allow_url_fopen PHP设置,也可以将任何URL插入$url。这样,您的服务器很容易被误用来从其他服务器传输大量数据,并带来各种影响。

这种提供文件的方法只能在真正需要的时候使用。它比通过Web服务器请求静态资源消耗更多资源(因为必须启动昂贵的PHP进程)。

无论如何,它不应该是必要的。这听起来像你的网络服务器没有提供正确的content-type标题以及你的MP3文件。这是你应该修复的。

也许,如果你在Apache上,增加了.htaccess文件的目录中的MP3都具有以下内容:

AddType audio/mpeg .mp3 

已经解决了这个问题。如果没有,但force-download事情的作品,然后尝试

AddType application/force-download .mp3 
2

您的实际问题是,你不发送Content-Type头到客户端,当你成为mp3文件。确保在发送mp3文件的内容之前设置内容类型标题。

如果您直接从Web服务器提供它们,而无需脚本,则只需在Web服务器的配置中配置内容类型即可。

对于Apache,你可以在.htaccess文件配置此:

AddType audio/mpeg .mp3 
1

呀肯定是这里的安全风险,因为你不验证/消毒所请求的文件路径。所以请确保在将文件发送给用户之前检查它!

虽然这将使用带宽和服务器资源,但它将少于定期下载文件。唯一的额外开销是处理/运行PHP。你可能不会注意到有什么不同。