Image de couverture : Laravel 13.27 : vos requêtes SQL écrivent vos secrets dans les logs, voici comment l'arrêter
PHP & Frameworks

Laravel 13.27 : vos requêtes SQL écrivent vos secrets dans les logs, voici comment l'arrêter

6 septembre 2026
6 min de lecture
26 vues
Sébastien Muler

Chaque erreur de base de données peut être une fuite de données

Quand une requête SQL échoue dans une application Laravel, le framework construit un message d'erreur complet : il insère les valeurs réelles dans la requête et enregistre le tout. Adresse e-mail saisie dans un formulaire d'inscription, hash de mot de passe, token d'API que vous venez de sauvegarder : toutes ces valeurs se retrouvent dans votre fichier de logs, dans Sentry, dans Logtail, ou dans n'importe quel autre outil de centralisation d'erreurs que vous avez branché.

Ce comportement existe depuis longtemps et peu de développeurs l'ont remarqué, parce qu'on ne lit pas les logs ligne par ligne au quotidien. Laravel 13.27, sorti le 26 août 2026, introduit une option pour masquer ces valeurs. Cet article explique comment l'activer, pourquoi elle ne suffit pas seule, et comment auditer ce qui a déjà fui.

Ce qui se passe concrètement lors d'une QueryException

Prenons un cas classique : une contrainte d'unicité sur la colonne email. Si vous tentez d'insérer un utilisateur dont l'adresse existe déjà, Laravel lève une UniqueConstraintViolationException. Le message de cette exception contient la requête SQL complète avec les bindings résolus, c'est-à-dire les vraies valeurs.

En pratique, votre stack de logging reçoit quelque chose comme :

INTEGRITY constraint violation: UNIQUE constraint failed: users.email
(SQL: insert into "users" ("name", "email", "password") values ('Mario Rossi', 'mario.rossi@example.com', '$2y$12$...'))

Le hash bcrypt est là. L'e-mail est là. Si l'erreur se produit lors d'un enregistrement d'un token d'API ou d'un code de réinitialisation de mot de passe, ces valeurs s'y trouvent aussi.

Ce n'est pas une faille obscure liée à une mauvaise configuration : c'est le comportement par défaut de Laravel sur toutes les versions antérieures à 13.27.

Activer le masquage avec mask_query_bindings()

La nouveauté de Laravel 13.27 s'active en une ligne dans votre AppServiceProvider :

use Illuminate\Database\Connection;

public function boot(): void
{
    Connection::maskQueryBindings();
}

Une fois activé, la QueryException ne contient plus les valeurs réelles dans son message. Les bindings sont remplacés par des points d'interrogation, comme dans la requête préparée d'origine.

Ce que cette option ne couvre pas

L'article source de Hafiz sur dev.to souligne un point important : maskQueryBindings() agit sur le message de l'exception, mais pas sur tous les chemins d'émission des données.

Si vous utilisez les query logs de Laravel (DB::enableQueryLog()), les valeurs restent présentes. Si un listener sur l'événement QueryExecuted enregistre la requête, il récupère toujours les bindings non masqués. Les jobs en queue qui échouent et persistent dans la table failed_jobs peuvent eux aussi contenir des données sensibles si la requête fait partie du payload sérialisé.

L'activation de maskQueryBindings() est nécessaire, mais elle doit s'accompagner d'une revue des autres points d'émission de logs dans votre application.

Auditer et purger les logs existants

L'option ne supprime pas ce qui a déjà été écrit. Si votre application tourne depuis plusieurs mois sans ce correctif, vos logs contiennent probablement des données personnelles.

Identifier les fuites dans les fichiers de logs

Pour les fichiers locaux dans storage/logs/, une recherche par pattern suffit pour estimer l'exposition :

grep -n 'insert into\|update.*set' storage/logs/laravel*.log | grep -i 'password\|token\|email'

Ce n'est pas exhaustif, mais ça donne une première mesure. Si vous trouvez des occurrences, la question suivante est de savoir combien de temps ces fichiers sont conservés et qui y a accès.

Gérer les logs centralisés (Sentry, Logtail, Flare)

Les outils de monitoring externe conservent leurs données indépendamment de votre infrastructure. Chaque outil dispose de sa propre procédure pour supprimer des événements ou expurger des données :

  • Sentry : suppression d'issues ou de groupes d'événements via l'interface ou l'API
  • Logtail : politique de rétention configurable, suppression manuelle par requête
  • Flare : suppression d'occurrences depuis le tableau de bord

Si vos logs contiennent des données personnelles au sens du RGPD (e-mails, noms, tout élément permettant d'identifier une personne), leur présence dans un outil tiers impose de vérifier que le traitement est couvert par votre accord de sous-traitance avec ce prestataire, et de pouvoir répondre à une demande de suppression.

La table failed_jobs

Vérifiez le contenu de la table failed_jobs si vous utilisez les queues Laravel. Le champ payload contient la sérialisation du job, qui peut inclure des modèles Eloquent avec leurs attributs. Une requête de contrôle :

SELECT id, connection, queue, LEFT(payload, 500), failed_at
FROM failed_jobs
ORDRE BY failed_at DESC
LIMIT 20;

Si des données sensibles y apparaissent, purgez les entrées obsolètes avec php artisan queue:flush après avoir archivé ce dont vous avez besoin pour le débogage.

Conclusion

maskQueryBindings() est une amélioration bienvenue qui aurait dû exister bien plus tôt. Son activation prend trente secondes et réduit immédiatement la surface d'exposition pour toutes les erreurs SQL futures.

Mais la vraie action utile est l'audit rétrospectif : savoir ce qui a déjà été enregistré, où ça se trouve, et combien de temps ça est conservé. Ce n'est pas une question de perfectionnisme : c'est ce qu'on vous demandera de produire si vous avez un incident de sécurité ou un contrôle RGPD.

Activez l'option, vérifiez vos logs existants, et documentez ce que vous avez fait. C'est l'ordre.

Source originale : Your Query Bindings Are in Your Logs par Hafiz sur dev.to.

Ce que ça change pour vous

Si votre site ou application est développé avec Laravel, chaque bug de base de données a peut-être enregistré des informations personnelles de vos clients (adresses e-mail, données de compte) dans des fichiers de diagnostic techniques. Ces fichiers sont rarement sécurisés comme une base de données, et ils sont souvent transmis à des prestataires d'hébergement ou de surveillance. Une mise à jour simple, à demander à votre développeur, permet d'arrêter ce comportement immédiatement. Vérifier et purger ce qui existe déjà dans ces fichiers est une démarche raisonnable avant tout audit ou incident, et elle vous protège en cas de question de la CNIL sur la gestion des données personnelles de vos clients.

Partager cet article

Et votre site, il vaut quoi ?

Vitesse, accessibilité, référencement technique. Le rapport est écrit pour un dirigeant, pas pour un développeur. Gratuit, sans inscription.

Tester mon site