Php readfile - 强制下载

时间:2010-06-20 14:30:13

标签: php readfile

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

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

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

4 个答案:

答案 0 :(得分:9)

不,那不安全。如果您在database.php中输入了数据库密码并且database.php输入了$_GET['url'],那么您的脚本会将包含密码的PHP文件发送给我。

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

答案 1 :(得分:5)

这不安全,你不应该这样做。

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

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

无论如何,在你的情况下都没有必要。听起来您的Web服务器没有提供正确的content-type标头以及您的MP3文件。这就是你应该解决的问题。

也许,如果您使用的是Apache,请将.htaccess文件添加到MP3所在的目录中,其中包含以下内容:

AddType audio/mpeg .mp3

已经解决了这个问题。如果没有,但force-download的工作正常,请尝试

AddType application/force-download .mp3

答案 2 :(得分:2)

您实际的问题是,当您提供mp3文件时,您没有向客户端发送内容类型标头。确保在发送mp3文件的内容之前设置内容类型标题。

如果您是直接从Web服务器提供服务而没有脚本,则只需在Web服务器的配置中配置内容类型。

对于Apache,您可以在.htaccess文件中配置它:

AddType audio/mpeg .mp3

答案 3 :(得分:1)

是的,由于您没有验证/清理请求的文件路径,因此肯定存在安全风险。因此,请确保在将文件发送给用户之前进行检查!

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