【发布时间】: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));
}
如果我们清除浏览器上的缓存,它会解决问题,直到您登录并下载新文件。同样在注销后,您将被完全阻止其他所有路线(即使是只需要身份验证的路线),直到您重新登录。以前下载的文件似乎是唯一违反此规则的东西。我们的文件名足够复杂,这不是主要的安全风险,因为它们仅适用于当前用户会话,但我不喜欢保留这种行为。
有什么想法吗?在此先谢谢大家,稍后我会尽量跟上,以防有人回复。
【问题讨论】:
标签: laravel file authentication download