【问题标题】:Laravel 5.4: How to securely track a selected item across page views?Laravel 5.4:如何跨页面浏览安全地跟踪所选项目?
【发布时间】:2017-04-14 20:47:47
【问题描述】:

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

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

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

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

那么我如何在 Laravel 中以用户无法欺骗 ID 等的方式安全地执行此操作? 我在想一些带有会话或 ID 哈希的东西,但不知道如何实际实现它。

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

非常感谢。

【问题讨论】:

    标签: php laravel laravel-5 laravel-5.4


    【解决方案1】:

    作为标识符放入 URL 中的任何内容都可能被破解,某种散列可以(显着)减慢速度,但不会解决您的问题,您最好使用“正确”身份验证。
    在您的控制器中,您可以检查用户是否有权访问指定页面。

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      如果有帮助,请告诉我!

      【讨论】:

      • 谢谢,但是在会话中,我看不到我如何跟踪用户单击的项目(让服务器提取正确的详细信息记录)以及如何防止用户访问其他用户的项目详细信息他们无权查看?谢谢
      【解决方案3】:

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

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

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

      【讨论】:

      • 谢谢。这将确保非用户无法查看详细信息页面(即公开),但不会阻止一个用户查看另一个用户的详细信息页面 - 因为他们都将登录/授权。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-18
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      相关资源
      最近更新 更多