Laravel 5.4:如何在页面浏览中安全地跟踪所选项目?
我是Laravel的新手,为多个用户构建网站,在其中一个网页上列出与登录用户相关的项目,允许用户点击某个项目,然后在下一页上查看或编辑细节。非常简单的概念,但我想知道何时由Laravel提供详细信息页面,如何简单可靠地知道哪个项目被点击并显示正确项目的详细信息。Laravel 5.4:如何在页面浏览中安全地跟踪所选项目?
解决此问题的一个显而易见的方法是在详细信息页面的URL中指定项目的主键ID - 即为第一页上的列表中的每个项目指定项目的主键ID,然后指定使用该项目返回正确的项目:
Route::get('/itemdetails/{ID}', '[email protected]');
然后显然使用指定的ID来做数据库查找。 问题是,这是完全不安全的,即任何用户都可以在ID字段中尝试不同的数字并访问其他用户的项目详细信息。
那么,如何以一种用户无法伪造的身份证等做到这一点牢固Laravel? 我在想什么会议或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有一个精心制作的方法来授权人员和操作,使用他们的门可以阅读更多here。
会话是安全存储这类信息的最佳方式!您可以使用session()->put('key','value')
在会话中添加值。这意味着您可以根据需要输入尽可能多的值!它将安全地存储您的数据,因为Laravel会将其存储在我认为的文件中!
您可以通过登录除外信息(session()->forget('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
这将允许(除了注销)只有权限的访问(即在Laravel默认设置为用户)
谢谢。这将确保非用户无法查看详细信息页面(即公开发布),但它不会阻止一个用户查看其他用户的详细信息页面 - 因为它们都将被登录/授权。 –
很好。很好的解决方案,谢谢:) –