web-dev-qa-db-ja.com

暗号化する方法laravel 5.2 URLまたはルート?

このURLのルートを暗号化する必要がありますか?ユーザーにアイテムIDを変更してURLにアクセスさせたくないからです。たとえば、ユーザーは/ items/1234を/ item/5678に変更できます。アイテム1234と5678は同じユーザーに属していますが、動作を制限したいのですが。私がやろうとしていることはルートを暗号化することですが、これが適切な方法であるかどうかはわかりません。助言がありますか?

6
sandip kakade

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)でURLパラメータを暗号化し、Crypt::decrypt($parameter)で復号化できます

8
Nazmul Hasan

この問題を軽減する1つの方法は、Universally Unique ID(UUID)を使用することです。

自動インクリメントデータベースクロールの問題がなくなり、ユーザーはURLを変更して別のデータを取得できなくなります。

Id列を次のように変更することで、移行でこれをサポートするようにデータベースを簡単に変更できます

この:

$table->increments('id');

これに:

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

次に、次のコードをクラスに追加することで、モデルを編集して、インクリメントしない主キーをサポートできます。

protected $incrementing = false;
3
Josh Bolton

リダイレクト中にコントローラのルートを暗号化するには、

\Crypt::encrypt(product_id)

製品ページでは、次を使用してURLから製品IDを復号化できます

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

それが最善の方法です。

ただし、ユーザーが編集する必要があるURLのProduct IDパラメータを編集すると、例外が発生する可能性があります。

3
Akshay Khale

すべてのルートを暗号化する必要はありません。これは悪い習慣です。 encrypt()ヘルパーを使用してパラメーターを暗号化し、decrypt()を使用してパラメーターを復号化できます。

$encryptedId = encrypt($id);

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

1
Alexey Mezenin

暗号化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

これがあなたの役に立つことを願っています!

ルート全体を暗号化したいようです。良い方法ではないかもしれませんが、その方法を次に示します。すべてのリクエストを受信する1つのコントローラーがあります。すべてのビジネスロジックをサービスに配置する必要があります。

  1. ルートファイルには、 "/ {encrypted}"およびcontroller @ method(名前はあなた次第)を指すルートがあります。

  2. コントローラーメソッドで、暗号化されたパラメーターを復号化します。解読された文字列は "item/100"かもしれません。次に、$routeParams = explode('/', $decrypted);をサービスに送信して処理する必要があります。例えば.

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

それが基本的な考え方です。しかし、実際には、暗号化されたURLのルーティングを管理するハンドラクラスがあります。このハンドラクラスでは、Laravelのルートファイルと同様に機能する構成配列が必要です。

0
JC Lee