J'ai besoin de chiffrer des routes dans cette URL? Parce que je ne veux pas que l'utilisateur accède à l'URL en changeant l'id de l'article. Par exemple, l'utilisateur peut changer/items/1234 en/item/5678. Bien que les éléments 1234 et 5678 appartiennent au même utilisateur, je souhaite néanmoins limiter le comportement. Ce que j'essaie de faire, c'est de chiffrer les routes, mais je ne suis pas sûr que ce soit une bonne façon ou non. Aucune suggestion?
Vous pouvez chiffrer votre paramètre d'URL et le déchiffrer dans votre contrôleur. Vous pouvez essayer ceci:
Selon vous: supposons que votre paramètre soit id ou que vous puissiez chiffrer un paramètre supplémentaire.
<?php
$parameter =[
'id' =>1,
];
$parameter= Crypt::encrypt($parameter);
?>
<a href="{{url('/url/',$parameter)}}" target="_blank">a link</a>
Votre itinéraire sera:
Route::get('/url/{parameter}', 'YourController@methodName');
Dans votre contrôleur, vous pouvez déchiffrer votre paramètre:
public function methodName($id){
$data = Crypt::decrypt($id);
}
Vous devez être votre espace de noms Crypt dans votre top du contrôleur
use Illuminate\Support\Facades\Crypt;
Remarque: Vous pouvez chiffrer le paramètre url avec Crypt::encrypt($parameter)
et le déchiffrer avec Crypt::decrypt($parameter)
.
Une façon de remédier à ce problème consiste à utiliser des ID universellement uniques (UUID).
Vous ne rencontrerez plus le problème de l'analyse de la base de données à incrémentation automatique et un utilisateur ne peut pas modifier les URL pour obtenir des données différentes.
Vous pouvez assez facilement changer votre base de données pour supporter cela dans vos migrations en changeant votre colonne id de
ce:
$table->increments('id');
pour ça:
$table->uuid('id')->primary();
Votre modèle peut ensuite être modifié pour prendre en charge la clé primaire non incrémentante en ajoutant les éléments suivants à votre classe:
protected $incrementing = false;
Vous pouvez chiffrer la route dans votre contrôleur lors de la redirection, en utilisant
\Crypt::encrypt(product_id)
et sur la page du produit, vous pouvez déchiffrer l'ID du produit à partir de l'URL à l'aide de
$product_id = \Crypt::decrypt($url_parameter)
c'est la meilleure façon possible.
Mais il y aura quelques chances d'exception si l'utilisateur édite le paramètre Product ID à partir de l'URL que vous devrez gérer.
Vous ne voulez pas chiffrer tous les itinéraires, c'est une mauvaise pratique. Vous pouvez utiliser encrypt()
helper pour chiffrer le paramètre et decrypt()
pour le déchiffrer.
$encryptedId = encrypt($id);
Il semble que vous souhaitiez chiffrer l'intégralité de l'itinéraire. Ce n'est peut-être pas une bonne pratique, mais voici comment le faire. Vous aurez un contrôleur qui reçoit toutes les demandes. Toute la logique métier devra être placée dans vos services.
Dans le fichier route, indiquez une route qui pointe vers "/ {crypté}" "et une méthode controller @ (le nom vous appartient).
Dans la méthode du contrôleur, déchiffrez le paramètre chiffré. Peut-être que la chaîne déchiffrée est "item/100". Ensuite, vous devrez $routeParams = explode('/', $decrypted);
et l'envoyer à un service pour le traiter. par exemple.
if($routeParams[0] == 'item') {
return ItemService::get($routeParams[1]);
}
C'est l'idée de base. Mais en pratique, vous auriez une classe de gestionnaire qui gère le routage de votre URL cryptée. Dans cette classe de gestionnaires, vous aurez besoin d'un tableau de configuration qui fonctionne de manière similaire au fichier route de Laravel.
Vous avez besoin d'encrypt URL ID/Any URL param et cela s'appelle id obfuscation. Vous pouvez le faire avec librairie de hashids . il convertit un entier tel que 347 en yr8 et vice-versa.
Inclure cette bibliothèque :
composer require hashids/hashids
Vous pouvez obtenir toutes les autres choses faciles de Obfuscation d'identifiant facile avec Laravel 5
_ {Cela vous aidera à chiffrer l'id de l'URL} _:
http://example.com/users/123
À
http://example.com/users/Mj3
J'espère que cela vous aidera bien!