Newsletter Apprendre Laravel #9

Envoyée le 22 avril 2019

Nouvelle newsletter avec plein de petites astuces à utiliser dans vos applications.

Emails dans les tests

Même si votre environnement de test ne peut pas envoyer de mail (en utilisant le driver log par exemple ou un service comme Mailtrap), cela ne veut pas dire que les adresses emails générées aléatoirement ne seront jamais réellement utilisées.

Récemment, un de mes services tiers a décidé d'envoyer des mails de notification depuis sa plateforme de sandbox (la plateforme utilisée pour les tests) à chaque paiement effectué. Le mail indiquait clairement dans une bannière qu'il provenait d'une plateforme de test et qu'aucun paiement ne serait réellement réalisé, mais cela n'a pas empêché M. X de paniquer et de répondre en demandant l'arrêt immédiat de ces prélèvements non souhaités.

Mieux vaut donc ne pas utiliser de vraies adresses dans vos tests, même si votre environnement est bien configuré pour ne pas laisser des mails sortir, cela ne veut pas dire que l'environnement de vos prestataires l'est.

Une petite astuce avec Faker, utilisez $faker->safeEmail à la place de $faker->email pour obtenir une adresse en « @example.com » qui ne sera associé à personne.

Faille de sécurité de POO

Spatie a relevé une injection SQL possible dans une de ses bibliothèques (laravel-query-builder) due à une documentation floue du framework.

Le problème vient de POO qui sécurise uniquement les paramètres de la requête, mais ne donne aucun moyen pour sécuriser le nom des colonnes. Dans le cas d'un ->orderBy(request('orderBy')), la colonne de tri provenant de l'utilisateur n'est donc pas sécurisée et il est donc très facile de mettre en place une injection SQL. Laravel conseille dorénavant dans la documentation, en rouge et très visible, de ne pas laisser les utilisateurs choisir le nom des colonnes de vos requêtes sans une liste de colonnes autorisées.

Redirections plus pratiques

Avec Laravel, il est possible de faire une redirection statique sans créer de contrôleur avec Route::redirect('/from', '/to');.

En Laravel 5.9 il sera possible de faire des redirections dynamiques avec ce système Route::redirect('/posts/{post}', '/articles/{post}'). Très pratique lorsque nous avons besoin de changer nos URL.

Afficher les erreurs en Blade

Cette fois-ci une amélioration qui arrive directement en Laravel 5.8.13 : la création d'une directive Blade pour afficher les erreurs des formulaires.

// À la place de :
@if ($errors->has('email'))
    <span>{{ $errors->first('email') }}</span>
@endif

// Il est possible d'écrire :
@error('email')
    <span>{{ $message }}</span>
@enderror

C'est également une petite amélioration mais qui permet de rendre le code un peu plus lisible. Le problème de ce genre de changement c'est qu'il ne prend pas en compte tous les cas d'usage les plus courants et donc il est toujours nécessaire d'utiliser la variable $errors pour ajouter une classe spécifique par exemple avec {{ $errors->has('email') ? 'text-red' : '' }}.

Si vous ne souhaitez pas utiliser de condition ternaire, la variable $errors contient un objet de type MessageBag qui a déjà quelques méthodes utiles pour améliorer la lisibilité :

{!! $errors->first('email', '<span>:message</span>') !!}

// Affiche <span>The email field is required.</span> en cas d'erreur
// Rien si aucune erreur (pas même les balises <span></span>)

Il est même possible d'abuser de ce mécanisme pour les classes CSS :

// Utilisation du deuxième paramètre de la méthode `first()`
<input name="email" class="{{ $errors->first('email', 'text-red') }}">

// À la place de la condition ternaire avec `has()`
<input name="email" class="{{ $errors->has('email') ? 'text-red' : '' }}">

Je trouve l'utilisation de has() plus logique mais l'utilisation de first() est plus agréable à écrire. Nous pourrions imaginer la création d'une méthode ifHas($key, $message) pour rendre la chose logique et agréable à utiliser.

Voilà pour cette nouvelle newsletter, j'espère qu'elle vous aura plu, n'hésitez pas à me faire vos retours en réponse à ce mail !

Bon week-end à tous,

Thibaud