一旦您下载并注销 Laravel 文件下载就不需要 Auth

Posted

技术标签:

【中文标题】一旦您下载并注销 Laravel 文件下载就不需要 Auth【英文标题】:Laravel File Downloads do not require Auth once you download them and logout 【发布时间】:2019-12-17 03:35:45 【问题描述】:

我和我的团队遇到了一个奇怪的 Laravel 错误,在搜索了几个小时并尝试了各种修复后,我们找不到一个好的解决方案。我们已经在 laravel 5.7、5.8 中对此进行了测试,甚至更新到 laravel 6 以查看它是否有帮助,我们得到了相同的结果。

问题:

我们实现了下载路径,因此我们可以轻松地从我们的存储文件夹中下载文件。我们将这条路由封装在一些中间件后面,包括用户访问级别和 Auth 中间件。一切似乎都很好,用户可以单击应用程序中的链接并轻松下载文件,您甚至可以直接将链接放在 URL 中以下载文件。当我们测试您无需登录即可下载文件时,问题就出现了。我们已将问题追踪到下面概述的特定路径。

    登录到应用程序。 (在登录之前,您无法通过将文件放入浏览器来下载文件,如我们预期的那样得到 403) 下载您想要的任何文件,我们将下载的特定文件称为“文件#1”。 退出应用程序。 此时应该没有身份验证。您无法访问您在上一次会话中没有下载的任何页面或任何文件。但是...如果您尝试放置刚刚下载的文件之一的路径,例如“File#1”..即使文件上应该有身份验证,文件也会下载到客户端。这似乎授权以某种方式保存到下载本身并跳过所有授权。在您按预期登录应用程序之前,无法下载任何其他未下载的文件。

代码如下:

注销方法:

public function logout(Request $request)
    
        $this->guard()->logout();
        $request->session()->flush();
        return redirect('/');
    

路线:

        Route::get('/download/file', array(
            'as' => 'download',
            'uses' => 'GeneratePDFController@download'
        ))->where('file', '.*')->middleware('auth');

中间件:

    public function handle($request, Closure $next)
    
        abort(403, 'Unauthorized action.');
        if (!Auth::check()) 
            abort(403, 'Unauthorized action.');
        

        return $next($request);
    

下载控制器:

    public function download($file)
       
        return response()->download(storage_path('app/public/' . $file));
    

如果我们清除浏览器上的缓存,它会解决问题,直到您登录并下载新文件。同样在注销后,您将被完全阻止其他所有路线(即使是只需要身份验证的路线),直到您重新登录。以前下载的文件似乎是唯一违反此规则的东西。我们的文件名足够复杂,这不是主要的安全风险,因为它们仅适用于当前用户会话,但我不喜欢保留这种行为。

有什么想法吗?在此先谢谢大家,稍后我会尽量跟上,以防有人回复。

【问题讨论】:

【参考方案1】:

您应该可以设置“不要缓存我!”标题连同下载:

return response()
    ->withHeaders([
        'Cache-Control' => 'no-cache, no-store, must-revalidate',
        'Pragma' => 'no-cache',
        'Expires' => '0'
    ])
    ->download(storage_path('app/public/' . $file));

【讨论】:

这似乎成功了!感谢您提供如此快速和有用的答案!希望这对将来的其他人有所帮助,这给我们带来了许多小时的痛苦!再次感谢易于实施的修复!

以上是关于一旦您下载并注销 Laravel 文件下载就不需要 Auth的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 注销特定用户

Laravel:注销特定用户

注销后重定向[关闭]

注销事件(Laravel 7)

Laravel 间歇性注销

Laravel 不活动时间设置