一旦您下载并注销 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的主要内容,如果未能解决你的问题,请参考以下文章