Laravel 5.4:如何跨页面浏览安全地跟踪所选项目?

Laravel 5.4: How to securely track a selected item across page views?

我是 Laravel 的新手,正在为多个用户构建一个网站,其中一个页面列出了与登录用户相关的项目,允许用户点击一个项目,然后点击下一个页面,查看或编辑详细信息。非常简单的概念,但我想知道 Laravel 何时提供详细信息页面,如何简单而安全地知道单击了哪个项目并显示正确项目的详细信息。

解决这个问题的明显方法是在详细信息页面的 URL 中指定项目的主键 ID - 即对于第一页列表中的每个项目,然后指定一个路由用它来 return 正确的项目:

Route::get('/itemdetails/{ID}', 'MyController@showitemdetailspage');

然后显然使用指定的 ID 进行数据库查找。 问题是,这是完全不安全的,即任何用户都可以在 ID 字段中尝试不同的数字并访问其他用户的项目详细信息。

那么我如何在 Laravel 中以用户无法伪造 ID 等的方式安全地执行此操作? 我正在考虑使用会话或 ID 的哈希值或其他东西,但不确定如何实际实现它。

由于我是新手,非常感谢源代码或具体细节!

非常感谢。

任何作为标识符放在 URL 中的东西都可以被破解,某种散列可以(显着地)减慢它的速度但不会解决你的问题,你最好使用 "proper"认证。
在您的控制器中,您可以检查用户是否有权访问指定页面。

public function showitemdetailpage($ID){
    $someModel = MyModel::find($ID);
    if($someModel->user_id == Auth::user()->id){
        return view('myawesomeview', ['detail' => $someModel]);
    }
    abort(404);
}

我在这里选择了 404 错误,以防止其他用户发现指定的 detailPage 是否存在,您也可以 return 状态代码 403(不允许)。这会让其他用户知道详细信息页面存在但他们无法访问。

通过阻止访问而不是混淆 ID,您可以确保没有人可以访问该页面,即使他们确实拥有 url(当然,这只有在正确实施身份验证的情况下才有效)。

我的示例只是检查身份验证的一种方法 Laravel 有一种复杂的方法可以通过使用他们的门来授权人员和操作,您可以阅读更多内容 here

会话是安全存储此类信息的最佳方式!您可以使用 session()->put('key','value') 在会话中添加值。这意味着您可以执行此操作以输入任意数量的值!它将安全地存储您的数据,因为 Laravel 会将其存储在我认为的文件中!

当您不需要特定会话中的值时,您可以通过删除登录信息 (session()->forget('key')) 以外的所有内容来清除会话值,或者您可以将其存储在数组中并删除不再需要时的整个阵列!我用同样的方法将服务器的 ID 存储在我的系统中,因为一个用户可以管理多台服务器!

如果有帮助请告诉我!

如果您使用的是内置 Laravel 身份验证,您可以在控制器顶部使用一个简单的构造函数,并记得使用 use Auth; 如果是全新安装,您还必须 运行 php artisan make:auth

use Auth;

class WhateverController extends Controller
{
    public function __construct()
         {
             $this->middleware('auth', ['except' => 'logout']);
         }

    ... Your Controller code

这将允许(注销除外)仅访问 auth(在 Laravel 中默认设置为用户)