使用标题(“位置:...”)进行文件下载的任何缺点?

时间:2014-10-31 13:31:44

标签: php zip download

我正在我的网站上设置MP3下载,并希望人们点击电子邮件中的链接下载MP3的ZIP文件。我希望他们点击的网址不直接指向文件,这样我就不会透露实际位置 - 我也可能会为下载添加时间限制等。

所以我一直在使用readfile($ file_url)并尝试了很多header()选项但是没有走得太远。然后我读到你可以使用:

header("Location: " . $file_url);

这似乎在我测试的浏览器中正常工作。与readfile($ file_url)相比,这样做是否有任何缺点?

谢谢!

2 个答案:

答案 0 :(得分:0)

没有严重的问题,只是你实际上揭示了文件的实际位置(攻击者可能会试图猜测他不应该访问的文件的地址),客户端将不得不向服务器发出额外的请求(延迟下载只需几毫秒)有时,webbrowser有一个糟糕的一天,并决定不出于各种原因关注搬迁。

从好的方面来说,这样你就不需要通过PHP处理文件了,节省了一小部分服务器资源(这是非常有问题的,因为readfile()函数非常优化,相比之下处理新的http请求)


回到原来的问题,当通过PHP提供文件下载时,你不需要以下3行代码:

<?php
//code copied from http://php.net/manual/en/function.header.php
// We'll be outputting a PDF
header('Content-type: application/pdf');
// It will be called downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');
// The PDF source is in files/originalfile.pdf
readfile('files/originalfile.pdf');
?>

在使用Header()函数&lt; - 频繁出现问题之前,请确保不要打印任何字符串(甚至不包括源代码中的UTF8 BOM字符)。

答案 1 :(得分:0)

&#34;缺点&#34;取决于你想要完成的事情。

通过设置Location标题,您可以重新发送重定向。实际上,浏览器将收到HTTP状态代码302(&#34; Found&#34;)和资源的新URL的响应。基本上,您将它们重定向到另一个资源 为了使其正常工作,您重定向到的资源必须可公开访问。那就是:它需要是&#34;文档根目录中的现有文档&#34;你的服务器。

这种方法具有某些特征,根据您的要求,可能被视为缺点:

  1. 如上所述,资源必须可公开访问。因此,您不能将MP3文件放在单独的不可访问的文件夹中。实际上,假设您的文档根位于/var/www/public,您可能希望将这些文件放在不可访问的文件夹中,例如/var/www/resources,并且只能通过PHP脚本提供它们。
  2. 您的用户将收到资源的URL,因此他们可以直接访问资源,而无需通过您的PHP脚本。
  3. 如果这些&#34;特征&#34;对你不好,那么你可能想避免使用Location标题。

    一些用于提供MP3文件的PHP代码可以是:

    $file = 'local/path/to/your_audio_file.mp3'; // the path on the local file system - ie. don't use "http://www.example.com"!
    
    header('Content-Description: File Transfer');
    header('Content-Type: audio/mpeg'); // audio/mpeg is the correct mime type for mp3 files
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit; // Could be a good idea to exit at the end
    

    某些标头可能是多余的,但它们可确保最佳的跨浏览器兼容性。我从http://php.net/manual/en/function.readfile.php

    获取了它们(然后进行了调整)