Objectif de cette page
Lorsque vous souhaitez utiliser tels quels les paramètres fixés à l’émission d’un lien de partage à durée limitée, il ne suffit pas de vérifier la signature de l’URL : il faut aussi être cohérent sur l’endroit d’où vous lisez les valeurs. Cette page s’appuie sur un exemple qui inclut le type de rapport et le format de sortie dans l’URL, puis renvoie un JSON d’aperçu. Elle concerne Laravel 13. Pour la génération d’URL en général, consultez Génération d’URL, et pour les bases de la récupération des entrées, Requêtes HTTP.Ce que protège la signature
input() est une API qui traite non seulement la chaîne de requête, mais aussi le corps. Lorsque Laravel fusionne ces entrées, les valeurs du corps ont priorité sur celles de la chaîne de requête.
query(), en revanche, ne récupère que la chaîne de requête.
Le succès de la vérification de la signature et le fait que les valeurs lues ensuite soient signées sont deux points distincts à contrôler.
Implémenter un lien d’aperçu à durée limitée
1. Définir la route à vérifier
Dansroutes/web.php, définissez une route nommée qui exige une signature.
Cet exemple ne manipule ni base de données ni fichier : il renvoie simplement les paramètres reçus.
- Le middleware
signedvérifie la signature et la date d’expiration avant l’exécution de la closure. S’il échoue, il renvoie403. query()récupère explicitement depuis la chaîne de requête les valeurs utilisées par le traitement.- La validation porte sur le tableau ainsi obtenu. La vérification de la signature ne garantit ni le type des valeurs ni leur conformité aux règles métier.
Dans cet exemple, seules les valeurs extraites avec
query() sont transmises à Validator::make().
Si vous les remplacez par $request->all() à un endroit censé valider la requête signée, vous traiterez des entrées qui incluent le corps.2. Générer l’URL dans un traitement d’émission de confiance
Une fois la route nommée enregistrée, utilisez le code suivant dans le traitement qui émet le lien.report et format ne sont pas des paramètres du chemin : ils sont donc ajoutés à la chaîne de requête.
expires et signature.
expires et signature sont des paramètres réservés utilisés par Laravel : ne les utilisez pas comme noms de paramètres métier.
Si vous exposez le traitement d’émission dans une application réelle, n’autorisez pas n’importe qui à émettre des liens avec des paramètres arbitraires, et appliquez l’authentification et l’autorisation nécessaires.
3. Vérifier l’utilisation normale
Si vous ouvrez l’URL émise telle quelle avant son expiration, le JSON suivant est renvoyé.signed de la route renvoie 403.
Une URL signée n’est pas un jeton à usage unique. Dans cet exemple, la même URL peut être réutilisée tant qu’elle n’a pas expiré.
Pour n’autoriser qu’une seule utilisation, vous devez gérer un état « déjà utilisé » indépendamment de la signature.
Séparer les valeurs exclues de la vérification
Pour autoriser des valeurs ajoutées par le frontend, comme un numéro de page, vous pouvez les exclure de la vérification avechasValidSignatureWhileIgnoring(['page']).
Cependant, n’importe qui peut modifier les valeurs exclues : ne les traitez donc pas comme des paramètres signés.
Par exemple, page, utilisé pour l’affichage, n’a pas le même rôle que report et format, fixés à l’émission.
N’excluez pas, par simple commodité, les valeurs servant à déterminer les données ciblées, le destinataire, le tarif, etc.
Utiliser une signature relative
Si la conception n’inclut pas le domaine dans la signature, combinezabsolute: false lors de la génération et signed:relative lors de la vérification.
middleware('signed') par middleware('signed:relative') dans la route précédente.
Avec une signature relative, le corps n’est pas non plus signé : la règle de récupération via query() reste donc la même.
Liste de contrôle pour l’implémentation
- La route de réception exige la vérification de la signature.
- Les valeurs de requête signées sont récupérées avec
query(). - Le format et les valeurs autorisées sont validés séparément.
- Les valeurs exclues de la vérification de la signature ne sont pas utilisées comme des paramètres fixés à l’émission.
- Le choix entre signature absolue et relative est cohérent entre la génération et la vérification.
- Connaître l’URL n’est pas assimilé aux droits de l’utilisateur connecté.
Pages associées et sources
- Génération d’URL : API des URL signées et réponse aux signatures invalides
- Requêtes HTTP : récupération des entrées et de la chaîne de requête
- Validation : validation du format des entrées et des valeurs autorisées
- Documentation officielle de Laravel : Signed URLs
- Documentation officielle de Laravel : Retrieving input from the query string
- Laravel Framework : UrlGenerator
- Laravel Framework : ValidateSignature