【问题标题】:How to let only authorized user access to some files?如何只让授权用户访问某些文件?
【发布时间】:2011-03-29 15:31:00
【问题描述】:

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

比如A上传file_a,并分享给B、C。用户B、C可以通过链接dl链接,但是用户D即使得到了链接,还是不能下载,即使他/她正在记录或不记录。我该怎么做这个检查?谢谢。

【问题讨论】:

    标签: php security apache


    【解决方案1】:

    一种解决方案是将文件夹设为私有(即:将其移出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

    【讨论】:

    • 您可以附加更多的 GET 参数,例如一些由实际时间和 UserID 生成的加密数据,以确保某些用户具有下载某些文件的权限。例如:http://yourdomain.com/files.php?filename=foobar.zip&id=d90abc8374&checkstate=ff94ad0e5700
    【解决方案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();
    

    【讨论】:

      【解决方案3】:

      三个选项:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-21
        • 1970-01-01
        • 2021-10-06
        • 2012-12-11
        • 2012-05-26
        • 2019-07-23
        • 2014-10-12
        • 1970-01-01
        相关资源
        最近更新 更多