我需要加密此网址中的路由?因为我不希望用户通过更改项ID来访问URL。例如,用户可以将/ items / 1234更改为/ item / 5678。虽然项目1234和5678属于同一用户,但我仍想限制行为。我想要做的是加密路线,但我不确定这是否是正确的方式。有什么建议吗?
答案 0 :(得分:6)
您可以加密您的url参数并在控制器中解密它。你可以试试这个:
在您的视图中:假设您的参数是id或更多参数,您可以加密。
<?php
$parameter =[
'id' =>1,
];
$parameter= Crypt::encrypt($parameter);
?>
<a href="{{url('/url/',$parameter)}}" target="_blank">a link</a>
您的路线将是:
Route::get('/url/{parameter}', 'YourController@methodName');
在您的控制器中,您可以解密您的参数:
public function methodName($id){
$data = Crypt::decrypt($id);
}
你必须是控制器顶部的Crypt名称空间
use Illuminate\Support\Facades\Crypt;
注意:您可以使用Crypt::encrypt($parameter)
加密网址参数,并使用Crypt::decrypt($parameter)
解密
答案 1 :(得分:3)
可以缓解此问题的一种方法是使用通用唯一ID(UUID)。
您将不再遇到自动增加数据库抓取的问题,并且用户无法更改URL以获取不同的数据。
您可以通过更改
中的id列,轻松更改数据库以在迁移中支持此功能这样:
$table->increments('id');
到此:
$table->uuid('id')->primary();
然后可以通过向您的班级添加以下内容来编辑您的模型以支持非递增主键:
protected $incrementing = false;
答案 2 :(得分:2)
您可以使用
在重定向时加密控制器中的路径 \Crypt::encrypt(product_id)
在产品页面上,您可以使用
从URL解密产品ID $product_id = \Crypt::decrypt($url_parameter)
这是最好的方式。
但如果用户编辑了您需要处理的URL中的产品ID参数,则会有一些例外情况。
答案 3 :(得分:1)
你不想加密所有路线,这是不好的做法。您可以使用encrypt()
帮助程序加密参数,使用decrypt()
解密它。
$encryptedId = encrypt($id);
答案 4 :(得分:0)
您需要加密URL ID /任何URL参数,这称为ID模糊处理。您可以使用hashids library执行此操作。它会将 347 之类的整数转换为 yr8 然后再返回。
包含此库:
composer require hashids/hashids
您可以从Easy id obfuscation with Laravel 5
获取所有其他简单内容这将帮助您加密网址:
http://example.com/users/123
要
http://example.com/users/Mj3
希望这对你有所帮助!
答案 5 :(得分:0)
听起来你想加密整个路线。这可能不是一个好习惯,但这里是如何做到的。您将拥有一个接收所有请求的控制器。所有业务逻辑都需要放在您的服务中。
在路径文件中有一条指向“/ {encrypted}”的路由和一个控制器@方法(名称取决于您)。
在控制器方法中,解密加密的参数。也许解密的字符串是“item / 100”。然后,您需要$routeParams = explode('/', $decrypted);
并将其发送到服务以进行处理。例如
if($routeParams[0] == 'item') {
return ItemService::get($routeParams[1]);
}
这是基本的想法。但实际上,您可以使用处理程序类来管理加密URL的路由。在这个处理程序类中,你需要一个与Laravel的路由文件类似的配置数组。
答案 6 :(得分:0)
我将提供一个对我来说很好的程序。如果主题当前不相关,请原谅。但如果是这样,请注意我为解决个人项目问题而采取的以下步骤
在此视图中,我加密了一个Blog_id / service_id / product_id的ID
<a href=" {{ route('blogs.show', ['id'=> Crypt::encrypt($blog->id),'slug' => Str::slug($blog->title) ]) }}">
通过上述操作,我们如下修改了路由(web.php)
Route::get('/blog_feed/{id}','BlogController@show')->name('blogs.show');
最后,在您的控制器中,您将执行路由模型绑定步骤
public function show($id)
{ $id = Crypt::decrypt($id); $blog = Blog::where('id', $id)->first(); $user = User::where('id', $blog->user_id)->first(); return view('blogs.show', compact('blog', 'user')); }
希望它对以后的搜索有帮助