Php Laravel 5.4:如何跨页面视图安全地跟踪所选项目?
我是Laravel的新手,我正在为多个用户建立一个网站,在其中一个页面上列出与登录用户相关的项目,允许用户单击一个项目,然后在下一个页面上查看或编辑详细信息。这是一个非常简单的概念,但我想知道当Laravel提供详细信息页面时,如何简单而安全地知道单击了哪个项目并显示正确项目的详细信息 解决这一问题的明显方法是,在详细信息页面的URL中指定项目的主键ID,即第一页列表中的每个项目,然后指定使用该ID返回正确项目的路由:Php Laravel 5.4:如何跨页面视图安全地跟踪所选项目?,php,laravel,laravel-5,laravel-5.4,Php,Laravel,Laravel 5,Laravel 5.4,我是Laravel的新手,我正在为多个用户建立一个网站,在其中一个页面上列出与登录用户相关的项目,允许用户单击一个项目,然后在下一个页面上查看或编辑详细信息。这是一个非常简单的概念,但我想知道当Laravel提供详细信息页面时,如何简单而安全地知道单击了哪个项目并显示正确项目的详细信息 解决这一问题的明显方法是,在详细信息页面的URL中指定项目的主键ID,即第一页列表中的每个项目,然后指定使用该ID返回正确项目的路由: Route::get('/itemdetails/{ID}', 'MyCon
Route::get('/itemdetails/{ID}', 'MyController@showitemdetailspage');
然后使用指定的ID进行数据库查找。
问题是,这是完全不安全的,即任何用户都可以在ID字段中尝试不同的号码,并访问其他用户的项目详细信息
那么,我如何在Laravel中安全地做到这一点,使用户不能伪造ID等?
我正在考虑使用会话或ID散列之类的东西,但不确定如何实际实现这一点
因为我是新手,所以非常感谢源代码或具体细节
非常感谢。任何放在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有一种精心设计的方法,通过使用他们的门来授权人员和行为,您可以阅读更多信息。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有一种精心设计的方法,通过使用他们的大门来授权人员和操作,您可以阅读更多信息。会话是安全存储此类信息的最佳方式!您可以使用
session()->put('key','value')
在会话中添加值。这意味着您可以这样做来输入任意多的值!它将安全地存储您的数据,正如我认为Laravel将其存储在文件中一样!
当您不需要特定会话中的值时,可以通过删除除登录信息以外的所有信息(
session()->忘记('key')
)来清除会话值,或者您可以将其存储在数组中,当不再需要时删除整个数组!我也会在我的系统中存储服务器的ID,因为一个用户可以管理多个服务器如果有帮助,请告诉我 会话是安全存储此类信息的最佳方式!您可以使用
session()->put('key','value')
在会话中添加值。这意味着您可以这样做来输入任意多的值!它将安全地存储您的数据,正如我认为Laravel将其存储在文件中一样!
当您不需要特定会话中的值时,可以通过删除除登录信息以外的所有信息(
session()->忘记('key')
)来清除会话值,或者您可以将其存储在数组中,当不再需要时删除整个数组!我也会在我的系统中存储服务器的ID,因为一个用户可以管理多个服务器如果有帮助,请告诉我 如果您使用内置的Laravel auth,您可以在控制器顶部使用一个简单的构造函数,并记住使用
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中默认设置为用户)如果您使用内置Laravel auth,您可以在控制器顶部使用一个简单的构造函数,并记住使用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中的auth默认设置为用户)谢谢。这将确保非用户(即公开)无法查看详细信息页面,但不会阻止一个用户查看另一个用户的详细信息页面,因为他们都将登录/授权。谢谢。这将确保非用户(即公开)无法查看详细信息页面,但不会阻止一个用户查看另一个用户的详细信息页面,因为他们都将登录/授权。谢谢,但在会话中,我看不到如何跟踪用户单击的项目(让服务器调出正确的详细信息记录)以及如何防止用户访问未经授权查看的其他用户的项目详细信息?感谢感谢,但在会话中,我看不到如何跟踪用户clic的项目