如何在 Laravel 8+ 中安全地使用 Hash 门面将结果用作路由参数

分享于2022年07月17日 hash laravel-8 php routes 问答
【问题标题】:如何在 Laravel 8+ 中安全地使用 Hash 门面将结果用作路由参数(How to use the Hash facade safely in Laravel 8+ to use the result as a route parameter)
【发布时间】:2022-06-27 22:03:46
【问题描述】:

我正在尝试散列 一些文本 ,然后将其用作路由中的参数。

我正在使用 Hash 外观来散列文本,如下所示

$hash = Illuminate\Support\Facades\Hash::make($text);

然后我像这样将它作为参数传递

//web.php
Route::get('profile/{$hashedText}/info', [ProfileController::class, 'info'])->name('profile.info');
//index.blade.php
route('profile.info', $hashedText);

我面临的问题是 Hash::make 函数并不总是生成 URL 友好的结果(即:存在 '/'、'?='、'&'...)

我注意到 Hash::make 函数不是恒定的(如果我用相同的文本运行它两次,我会得到不同的结果)所以我认为我可以循环遍历结果直到得到一个好的结果。

有什么好的方法可以解决这个问题吗?


【解决方案1】:

你可以这样做:

$thing = strtr(base64_encode($string), '+/=', '._-');

这将对字符串进行 base64 编码,并将任何 +、/ 或 = 替换为 .、_ 或 -。

显然可以添加其他替换。

可以将它与 Laravel 哈希库结合起来。