【问题标题】:How to secure Laravel Storage folders如何保护 Laravel 存储文件夹
【发布时间】:2019-04-13 20:11:52
【问题描述】:

在我的项目中,我为我的控制器和路由实现了身份验证和 ACL。我只有在用户登录时才能访问文件上传系统。它工作正常。

我的问题在于上传的文件。如果有文件 URL,用户可以访问任何文件。如何对上传的文件实施身份验证?

我尝试使用路由,但是当通过浏览器访问我的文件时,文件显示为好像没有截获此 URL 的路由。

我用过这段代码:

Route::get('/storage/document/3/4a15c1ab060be8f35.png', function () {
  return 'ok';
});

如何对存储上的特定文件夹实施身份验证?谢谢!

【问题讨论】:

    标签: php laravel authentication storage acl


    【解决方案1】:

    如果您想根据某种权限限制每个用户对文件的访问,您需要自己构建该权限逻辑(StackOverflow 不会为您完成您的工作),但为了回答这个问题,假设你已经有了权限系统,为了检查用户是否有访问权限,我们的函数是hasAccessToFile,它基本上只是根据你的业务逻辑需要进行查找。

    您可以提供单个文件,而不是公开提供所有文件,这是一个非常简短的示例:

    Route::get('files/{pathToFile}', function($pathToFile) {
    
        if (auth()->user()->hasAccessToFile($pathToFile)) {
            return response()->file($pathToFile);
        } else {
            return 'Nope, sorry bro, access denied!';
        }
    
    });
    

    请参阅File Responses 文档。

    如果您需要提供文件的下载而不是提供文件,类似地:

    Route::get('files/{pathToFile}', function($pathToFile) {
    
        if (auth()->user()->hasAccessToFile($pathToFile)) {
            return response()->download($pathToFile);
        } else {
            return 'Nope, sorry bro, access denied!';
        }
    
    });
    

    请参阅File Downloads 文档。

    【讨论】:

    • 不要将公用文件夹或任何子目录用于受保护的文件。如果您需要显示受保护的图像或下载文件,然后通过您可以控制的端点(路由)提供它。
    • @LucianoBraga Adam 刚刚说过。如果您不想公开所有内容,则不应该公开所有内容。如果您想私下提供文件,则无法通过 public 资源目录在存储中访问它们。有道理吗?
    • @LucianoBraga 没错,将它们移动到公共目录之外的任何您喜欢的位置,最好是存储文件夹,如果您的存储文件夹是符号链接的,您需要确保目标文件夹不是公开可读的,很明显。
    • 好的。谢谢大家!!
    • 也许只要去掉任何遍历尝试就足够了,即../,但你可以发挥创造力并制作一些健壮的东西。虽然,这是正确的,远远超出了 OP 的范围,但人们仍然访问 SO 问题和 CTRL+C CTRL+V 而不考虑他们在应用程序中添加的内容@StephenLake
    【解决方案2】:

    你可以参考我的回答here。该过程包括创建一个新的存储磁盘,将文件保存在/storage/app/(不在公用文件夹中),并在将文件提供给用户之前验证请求。

    【讨论】:

    • 谢谢!帮了我很多...
    • @leonnicklas 不客气
    猜你喜欢
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    相关资源
    最近更新 更多