如何让只有授权用户访问某些文件?

时间:2011-03-29 15:31:00

标签: php security apache

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

例如,A上传file_a,并与B,C共享。用户B,C可以通过链接dl链接,但是用户D甚至他/她得到了链接,但是他/她仍然无法下载,即使他/她正在记录与否。我怎么做这个检查?谢谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

不要将文件保存为数据库中的blob ...而是将文件保留在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();

答案 2 :(得分:0)

三个选项:

  1. 将文件放入blob中,并跟踪应用程序中的权限。
  2. 稍微不那么安全,但更容易实现:不允许任何人访问实际文件,然后使用uuid生成符号链接,但只允许它在下载期间保持不变。
  3. 为每个用户提供他们自己的目录,只有他们有权访问(htaccess),并为他们应该在该目录中访问的每个文件创建符号链接。
  4. 1号是最干净的,但其他两个是可行的解决方案。