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

时间:2017-04-14 20:47:48

标签: php laravel laravel-5 laravel-5.4

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

解决此问题的显而易见的方法是在详细信息页面的URL中指定项目的主键ID - 即对于第一页上列表中的每个项目,然后指定使用该项目返回正确的路由项:

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

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

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

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

非常感谢。

3 个答案:

答案 0 :(得分:2)

作为标识符放入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,您可以确定没有人可以访问该页面,即使他们确实有网址(当然这只有在正确实施身份验证时才有效)。

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

答案 1 :(得分:0)

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

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

请告诉我这是否有帮助!

答案 2 :(得分:0)

如果您使用内置的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中默认设置为用户)