安全文件-仅经过身份验证的用户下载

时间:2019-09-25 11:11:17

标签: php download yii2 webserver

如何在网络服务器上保护文件? 希望他们只能由经过身份验证的用户下载 我如何阻止某人输入文件URL并仅下载它而不进行身份验证。 举例来说-一个用户下载了文件-也许您有一个控制器 会检查auth并使用以下url将文件流式传输给他们: 即:site.com/controller/download/filename 什么可以阻止人们直接不通过身份验证就这样做: site.com/files/filename.ext

直接指向文件的链接实际上会绕过整个Web框架,而只是下载文件。

也许我在这里缺少基本知识-但是如何做到这一点并使文件保持私有?

谢谢!

2 个答案:

答案 0 :(得分:1)

根据唯一的加密ID对文件执行下载操作,如下所示。每个文件都应输入到 file 表中,该表将保存文件名,原始名称,上传者,uuid等数据,根据该数据,您可以将限制应用于下载操作。如果只希望登录用户能够下载文件,则还应该为下载操作定义access rule

public function actionDownload($id) 
    { 
        $file = File::findOne(['uuid'=>$id]);
        if($file!=null)
        {
           $path = UPLOAD_BASE_PATH.'/'.$file->name;
           if (file_exists($path) && !is_dir($path)) {
            return Yii::$app->response->sendFile($path,$file->original_name);
           }
        }
        throw new NotFoundHttpException("File not found");
    }

答案 1 :(得分:0)

如果您不希望人们允许通过直接链接访问文件,则应将文件保存在Web根目录之外。 在yii2中,您的Web根目录位于/web文件夹中,并且该文件夹应设置为Web的文档根目录。这将使服务器将所有请求指向该服务器,以防止尝试直接访问/web文件夹之外的文件。 有关更多信息,请参见apache docs

如果必须将文件夹放在可以直接访问它的位置,则可以使用.htaccess阻止对文件夹的任何直接访问。这个问题的答案是:Deny access to one specific folder in .htaccess