Php readfile-强制下载

Php readfile-强制下载,php,readfile,Php,Readfile,我正在用flash播放器播放一些mp3文件。在firefox上,它可以正常加载,但在IE上却不能。当我转到.mp3文件的url时,它会显示mp3的源代码(而不是提供下载eg)。所以我用了一个小脚本来修复它: $url = $_GET['url']; header('Content-type: application/force-download'); header('Content-Transfer-Encoding: Binary'); header("Content-disposition:

我正在用flash播放器播放一些mp3文件。在firefox上,它可以正常加载,但在IE上却不能。当我转到.mp3文件的url时,它会显示mp3的源代码(而不是提供下载eg)。所以我用了一个小脚本来修复它:

$url = $_GET['url'];
header('Content-type: application/force-download');
header('Content-Transfer-Encoding: Binary');
header("Content-disposition: attachment; filename=demo.mp3");
readfile($url);
我想问你上面的东西是否安全。此外,服务器是否会以这种方式丢失带宽?最后,它会影响服务器的资源吗?
谢谢。

不,那不安全。如果您的数据库密码在
database.php
中,而我以
$\u GET['url']
的身份输入了
database.php
,那么您的脚本会将包含密码的php文件发送给我


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

这样做不安全,您也不必这样做

除了@ceejayoz概述的安全含义外,如果启用了
allow\u url\u fopen
PHP设置,还可以在
$url
中插入任何url。这样,您的服务器可能很容易被误用,从其他服务器传输大量数据,并产生各种影响

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

无论如何,在你的情况下,这是不必要的。听起来您的web服务器没有为您的MP3文件提供正确的
内容类型
标题。这就是你应该解决的问题

如果您在Apache上,可能会向MP3所在的目录添加一个
.htaccess
文件,其中包含以下内容:

AddType audio/mpeg .mp3
已经解决了这个问题。如果没有,但是
强制下载
功能可以运行,那么请尝试

AddType application/force-download .mp3

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

如果直接从web服务器提供服务,而不需要脚本,则只需在web服务器的配置中配置内容类型

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

AddType audio/mpeg .mp3

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

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