4

我正在使用 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

4 回答 4

9

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

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

于 2010-06-20T14:32:23.650 回答
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
于 2010-06-20T14:34:44.697 回答
2

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

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

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

AddType audio/mpeg .mp3
于 2010-06-20T15:15:49.763 回答
1

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

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

于 2010-06-20T15:21:17.127 回答