【问题标题】:How to encrypt laravel 5.2 URL or Routes?如何加密 laravel 5.2 URL 或路由?
【发布时间】:2017-05-07 15:57:41
【问题描述】:

我需要加密此 URL 中的路由吗?因为我不希望用户通过更改项目 ID 来访问 URL。例如,用户可以将 /items/1234 更改为 /item/5678。虽然项目 1234 和 5678 属于同一个用户,但我仍然想限制该行为。我想做的是加密路由,但我不确定这是否是正确的方法。有什么建议吗?

【问题讨论】:

  • 你不能在路由里面加密它,你在你的控制器里面加密它
  • “虽然item 1234和5678属于同一个用户,但我还是要限制行为”。为什么?
  • 如果这样做确实存在一些问题/用例,请使用该用例制作中间件
  • 您可以为路由提供别名并加密参数。
  • 我现在坚持类似的要求.. 你是怎么做到的?

标签: php laravel encryption laravel-5.2


【解决方案1】:

您可以加密您的 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;

注意:url参数可以用Crypt::encrypt($parameter)加密,Crypt::decrypt($parameter)解密

【讨论】:

  • 我可以加密路由吗?
  • 您可以从通过 routes/url 的视图中加密所有参数。只需解密控制器中的参数。而已。 ——
  • 是的,你是对的,但我想加密参数和路由。
  • 可能是您无法在路由内加密路由。只有您可以从视图和控制器进行加密。
【解决方案2】:

缓解此问题的一种方法是使用通用唯一 ID (UUID)。

您将不再遇到自动增量数据库爬网的问题,并且用户无法更改 URL 以获取不同的数据。

您可以通过更改您的 id 列来轻松更改数据库以在迁移中支持这一点

这个:

$table->increments('id');

到这里:

$table->uuid('id')->primary();

然后可以通过将以下内容添加到您的类中来编辑您的模型以支持非递增主键:

protected $incrementing = false;

【讨论】:

  • 这绝对是解决这个问题的更好方法,你坚持正常的约定,但提供了一种更强大的方法来保护你的用户 ID
【解决方案3】:

您可以在重定向时加密控制器中的路由,使用

\Crypt::encrypt(product_id)

在产品页面上,您可以使用

从 URL 中解密产品 ID

$product_id = \Crypt::decrypt($url_parameter)

这是最好的办法。

但如果用户编辑的产品ID参数来自您需要处理的URL,则会有一些异常的机会。

【讨论】:

    【解决方案4】:

    您需要加密 URL ID/任何 URL 参数,这称为 id 混淆。您可以使用hashids library 来完成。它将像 347 这样的整数转换为 yr8 并再次返回。

    包括这个库

    composer require hashids/hashids
    

    你可以从Easy id obfuscation with Laravel 5获得所有其他简单的东西

    这将帮助您加密 URL id

    http://example.com/users/123
    

    http://example.com/users/Mj3
    

    希望对您有所帮助!

    【讨论】:

    • 我想要这样的网址,例如 http://example.com/users/Mj3http://example.com/hjksdhsdfssdf8/Mj3
    • 我认为没有必要为这个简单的功能包含一个包。如果提问者要走这条路,当然最好在应用程序中创建一个没有您建议的包那么重的简单函数。
    • @JoshBolton 你是对的,但这是不同的东西。你可以举个例子,比如 youtube URL。
    【解决方案5】:

    您不想加密所有路由,这是不好的做法。您可以使用encrypt() helper 加密参数和decrypt() 解密它。

    $encryptedId = encrypt($id);
    

    https://laravel.com/docs/5.3/encryption#using-the-encrypter

    【讨论】:

      【解决方案6】:

      听起来你想加密整个路由。这可能不是一个好习惯,但这里是如何做到的。您将拥有一个接收所有请求的控制器。所有业务逻辑都需要放在您的服务中。

      1. 在路由文件中有一个指向“/{encrypted}”的路由和一个controller@method(名称由您决定)。

      2. 在控制器方法中,解密加密的参数。也许解密的字符串是“item/100”。然后您需要$routeParams = explode('/', $decrypted); 并将其发送到服务进行处理。例如

      if($routeParams[0] == 'item') { return ItemService::get($routeParams[1]); }

      这是基本的想法。但在实践中,您将拥有一个处理程序类来管理您的加密 URL 的路由。在这个处理程序类中,你需要一个配置数组,其功能类似于 Laravel 的路由文件。

      【讨论】:

        【解决方案7】:

        我将给出一个适合我的程序。如果该主题目前不相关,请原谅我。但如果是,请注意我为解决个人项目问题而采取的以下步骤

        1. 这是我加密了 blog_id/service_id/product_id 的 id 的视图

          &lt;a href=" {{ route('blogs.show', ['id'=&gt; Crypt::encrypt($blog-&gt;id),'slug' =&gt; Str::slug($blog-&gt;title) ]) }}"&gt;

        2. 有了上面的我们然后修改我们的路由(web.php)如下

        Route::get('/blog_feed/{id}','BlogController@show')-&gt;name('blogs.show');

        1. 最后,在您的控制器中,您将执行 路由模型绑定步骤

          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'));
          }
          

        希望对以后的搜索有所帮助

        【讨论】:

          猜你喜欢
          • 2016-04-02
          • 2018-03-19
          • 2016-08-30
          • 2016-12-01
          • 2016-06-24
          • 1970-01-01
          • 2017-12-13
          • 2017-06-11
          • 2016-04-23
          相关资源
          最近更新 更多