2011-03-29 103 views
3

这是的情况:我有一个Apache服务器,其中托管一个PHP程序,该程序允许用户登录和用户可以上传文件,并将他们的上传文件分享给他人,所以,我有一个名为“附件“在htdoc文件夹中,这是存储用户的附件。但我不希望人们直接访问此文件夹,我只让一些用户(基于他们的用户权限)获取他们想要的文件,其他人可以访问该文件...如何让只有授权的用户访问某些文件?

For例如,上传file_a,并与B,C共享。用户B,C可以通过链接获得链接,但用户D即使获得了链接,但他/她仍然无法下载,即使他/她正在记录或不记录。我怎样才能做这个检查?谢谢。

回答

0

三个选项:

  1. 放入一个blob文件,并跟踪应用程序的权限。
  2. 安全性稍差,但更容易实现:不允许任何人访问实际文件,然后使用uuid生成符号链接,但只允许它在下载期间持续存在。
  3. 为每个用户提供他们自己的目录,只有他们有权访问(htaccess)并为他们应该在该目录中访问的每个文件创建符号链接。

1号是最干净的,但另外两个是可行的解决方案。

2

一种解决方法是使文件夹保密(即:将其从htdocs中移出)并使用网关脚本。事情是这样的:

$fullpath = '/path/to/your/files/'.basename($_GET['filename'])); 

// verify that the user is valid here 
// verify that file exists here 

// get the mime type 
$finfo = finfo_open(); 
$mime = finfo_file($finfo, $fullpath, FILEINFO_MIME_TYPE); 

// send it to the client 
header('Content-Disposition: attachment; filename='.basename($fullpath)); 
header('Content-Type: '.$mime); 
readfile($fullpath); 

所以,你链接到它想:

http://yourdomain.com/files.php?filename=foobar.zip

+0

您可以附加更多的GET参数,如通过实际时间和用户ID生成的一些加密数据,以确保某个用户有权下载某些文件。 例如: 'http://yourdomain.com/files.php?filename = foobar.zip&id = d90abc8374&checkstate = ff94ad0e5700' – Wh1T3h4Ck5 2011-03-29 15:49:45

2

不要让文件在您的分贝斑点......相反,保持文件在你的web目录之外,然后有一个php文件来检查访问,并且如果文件有正确的访问权限,则将文件提供给人员。

 $file = 'file_path'; 
     header("Content-Type: image/jpeg"); 
     header("Content-Length: " . filesize($file)); 
     header("Content-Disposition: attachment; filename=\"filename.jpg\""); 
     header('Cache-Control: private'); 
     header('Pragma: private'); 
     $fp = fopen($file,"rb"); 
     fpassthru($fp); 
     fclose($fp); 
     exit(); 
相关问题