このURLのルートを暗号化する必要がありますか?ユーザーにアイテムIDを変更してURLにアクセスさせたくないからです。たとえば、ユーザーは/ items/1234を/ item/5678に変更できます。アイテム1234と5678は同じユーザーに属していますが、動作を制限したいのですが。私がやろうとしていることはルートを暗号化することですが、これが適切な方法であるかどうかはわかりません。助言がありますか?
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)
で復号化できます
この問題を軽減する1つの方法は、Universally Unique ID(UUID)を使用することです。
自動インクリメントデータベースクロールの問題がなくなり、ユーザーはURLを変更して別のデータを取得できなくなります。
Id列を次のように変更することで、移行でこれをサポートするようにデータベースを簡単に変更できます
この:
$table->increments('id');
これに:
$table->uuid('id')->primary();
次に、次のコードをクラスに追加することで、モデルを編集して、インクリメントしない主キーをサポートできます。
protected $incrementing = false;
リダイレクト中にコントローラのルートを暗号化するには、
\Crypt::encrypt(product_id)
製品ページでは、次を使用してURLから製品IDを復号化できます
$product_id = \Crypt::decrypt($url_parameter)
それが最善の方法です。
ただし、ユーザーが編集する必要があるURLのProduct IDパラメータを編集すると、例外が発生する可能性があります。
すべてのルートを暗号化する必要はありません。これは悪い習慣です。 encrypt()
ヘルパーを使用してパラメーターを暗号化し、decrypt()
を使用してパラメーターを復号化できます。
$encryptedId = encrypt($id);
暗号化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つのコントローラーがあります。すべてのビジネスロジックをサービスに配置する必要があります。
ルートファイルには、 "/ {encrypted}"およびcontroller @ method(名前はあなた次第)を指すルートがあります。
コントローラーメソッドで、暗号化されたパラメーターを復号化します。解読された文字列は "item/100"かもしれません。次に、$routeParams = explode('/', $decrypted);
をサービスに送信して処理する必要があります。例えば.
if($routeParams[0] == 'item') { return ItemService::get($routeParams[1]); }
それが基本的な考え方です。しかし、実際には、暗号化されたURLのルーティングを管理するハンドラクラスがあります。このハンドラクラスでは、Laravelのルートファイルと同様に機能する構成配列が必要です。