2016-12-22 14 views
4

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

+0

あなたはそれをあなたのコントローラ内で暗号化できません。 – Beginner

+0

"アイテム1234と5678は同じユーザーに属していますが、依然として動作を制限したい"どうして? – Abhishek

+0

実際にこれを行ういくつかの問題/ユースケースがある場合、そのユースケースを持つミドルウェアを作成してください – Abhishek

答えて

5

urlパラメータを暗号化し、コントローラで復号化することができます。これを試すことができます:

あなたの見解では、あなたのパラメータがあなたが暗号化できるid以上のパラメータであるとします。

<?php 
     $parameter =[ 
      'id' =>1, 
     ]; 
    $parameter= Crypt::encrypt($parameter); 
?> 
<a href="{{url('/url/',$parameter)}}" target="_blank">a link</a> 

あなたのルートは次のようになります。

Route::get('/url/{parameter}', 'YourContro[email protected]'); 

あなたのコントローラでは、あなたのパラメータを復号化することができます

public function methodName($id){ 
    $data = Crypt::decrypt($id); 
    } 

あなたは、コントローラ

のあなたの一番上にあるあんた墓所の名前空間でなければなりません
use Illuminate\Support\Facades\Crypt; 

注:ca n暗号化URLパラメータCrypt::encrypt($parameter)で復号化し、Crypt::decrypt($parameter)で復号化します。

+0

私はルートを暗号化できますか? –

+0

routes/urlを通過するビューからすべてのパラメータを暗号化できます。コントローラのパラメータを復号化するだけです。それでおしまい。 - –

+0

はい、あなたは正しいですが、私は経路と同様にパラメータを暗号化します。 –

0

暗号化URL ID /任意のURLパラメータが必要です。これはID難読化と呼ばれます。あなたはhashids libraryでそれを行うことができます。 のような整数をyr8に変換して再び戻します。

は、このライブラリを含める:

composer require hashids/hashids 

あなたはEasy id obfuscation with Laravel 5

から他のすべての簡単なものを得ることができます。これは、URLのID暗号化するのに役立ちます:

TO

http://example.com/users/123 

http://example.com/users/Mj3 

これがうまくいくと思います!

+0

http:// example.com/users/Mj3'からhttp:// example.com/hjksdhsdfssdf8/Mj3にこのようなURLを入力したい –

+0

私はこのためにパッケージを含める必要はないと思いますシンプルな機能。質問者がこのルートを下っていたなら、確かにあなたが提案するパッケージほど重くない単純な関数をアプリケーションで作成するほうがよいでしょう。 –

+0

@JoshBoltonあなたは正しいですが、これは何か異なるものです。 youtubeのURLのような例を取ることができます。 –

1

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

$encryptedId = encrypt($id); 

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

0

あなたが全体の経路を暗号化するように聞こえます。それは良い習慣ではないかもしれませんが、ここでそれを行う方法です。すべての要求を受け取るコントローラーが1つあります。すべてのビジネスロジックをお客様のサービスに配置する必要があります。

  1. ルートファイルには、 "/ {encrypted}"とコントローラ@メソッド(名前はあなた次第です)を指すルートがあります。

  2. コントローラメソッドでは、暗号化されたparamを復号化します。おそらく、解読された文字列は "item/100"です。その後、$routeParams = explode('/', $decrypted);が必要となり、処理するサービスに送信します。例えば基本的な考え方だ

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

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

2

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

自動インクリメントデータベースクロールの問題はなくなり、ユーザーは異なるデータを取得するためにURLを変更することはできません。これに

$table->increments('id'); 

:あなたは非常に簡単に

これからあなたのidカラムを変更することによって、あなたの移行でこれをサポートするために、データベースを変更することができます

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

あなたのモデルができますクラスに次のものを追加して、非インクリメンタルプライマリキーをサポートするように編集してください:

リダイレクトながら
protected $incrementing = false; 
+0

これは間違いなくこの問題に取り組むより良い方法ですが、通常の規約に従っていますが、より堅牢な方法でユーザーのIDを保護しています – zealisreal

3

あなたは

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

を使用してURLから製品IDを復号化することができます

\Crypt::encrypt(product_id)

と製品ページ上を使用して、あなたのコントローラにルートを暗号化することができますそれが最善の方法です。

しかし、ユーザーの編集が処理する必要があるURLからプロダクトIDパラメータを取得する場合、例外が発生する可能性があります。

関連する問題