限制PHP中的文件下载

时间:2011-11-25 02:02:02

标签: php apache security zend-framework

假设我的服务器位于http://www.example.com

然后我将文件file.exe放在根服务器的files目录中,因此通常可以通过在浏览器中输入该文件来下载该文件

http://www.example.com/files/file.exe

假设我有一个php脚本,首先对用户进行身份验证,然后将其重定向到该file.exe下载页面

例如。使用这种方法:

   header('Location: http://www.example.com/files/file.exe');
   exit(0);

的最佳方式是什么?

1。)阻止未经身份验证的用户通过在上面输入该网址来访问该文件而

2.。)尽管1)PHP脚本仍然能够提供该文件。)因此,经过身份验证的用户应该能够在该位置下载该文件

假设我使用标准LAMP堆栈(我也使用Zend Framework)

4 个答案:

答案 0 :(得分:6)

假设文件不是很大,这应该可行:

  • 将文件放在Web服务器文档根目录之外的某个位置,这样任何Web浏览器都无法直接访问它。

  • 如果用户经过身份验证,您的PHP脚本会将文件提供给用户。

  • 请务必使用header()为该文件发送正确的MIME类型。

如果文件非常大,您可能会遇到一些PHP内存或输出限制。

答案 1 :(得分:2)

0:将文件与数据库中的键匹配。例如。 file.exe = 2fae

1:让用户转到

http://www.example.com/download.php?key=2fae

2/3:检查用户是否有权下载该密钥/文件。

3/2:在数据库中查找,将该密钥与实际文件路径匹配

4:在download.php上,写一下。

header('Content-disposition: attachment; filename='.$actual_file_path_and_name);
header('Content-type: application/exe'); // optional
readfile($filename);

它允许用户下载file.exe而不让他看到file.exe的实际URL。它发生在download.php。

参考:http://webdesign.about.com/od/php/ht/force_download.htm

答案 2 :(得分:1)

如果您正在使用Zend Framework,您应该考虑使用框架为您提供的内置解决方案,而不是使用简单的PHP脚本。使用ZF的最佳解决方案是将Zend_SessionZend_Acl结合使用。因此,您将在会话用户中设置一个值,用于在登录您的网站时描述访问者角色。然后,您可以根据会话中设置的角色,使用Zend_Acl限制对资源的访问。

答案 3 :(得分:1)

我认为在这种情况下使用php代理来访问文件就足够了,其中包括:

<强>的download.php

<?php
   /** Load your user assumed $user **/
   $file = '/files/file.exe';

   if (true === $user->exists()) { //do any other acl checks here
       //from http://php.net/manual/en/function.readfile.php
       header('Content-Description: File Transfer');
       header('Content-Type: application/octet-stream');
       header('Content-Disposition: attachment; filename="'.$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));
       ob_clean();
       flush();
       readfile($file);
       exit;
   } else {
       throw new Exception('Download restricted to authorized users only');
   }

.htaccess 要拒绝所有直接文件下载,请使用以下内容放在/ files /目录中

deny from all

然后使用/download.php链接到该文件?如果用户已登录,它只会下载该文件

希望有所帮助