ObiDevTech ObiDevTech

Sécuriser vos formulaires Laravel : CSRF, XSS, uploads et injections SQL

Sécurité applicative concrète et actionnable pour tout projet Laravel en production.

20/05/2025 4 min 2 246 par Hoyt Botsford

Une enquête sur les incidents de sécurité web révèle systématiquement que la grande majorité des compromissions passent par des vecteurs liés aux formulaires : injection SQL via des paramètres non échappés, XSS via des champs de texte mal filtrés, upload de fichiers malveillants, ou CSRF via des requêtes forgées. Laravel intègre des protections pour chacun de ces vecteurs — encore faut-il savoir les activer et les utiliser correctement.

1. Protection CSRF : ne jamais désactiver, toujours vérifier

Laravel génère et vérifie automatiquement un token CSRF pour chaque requête POST, PUT, PATCH et DELETE via le middleware VerifyCsrfToken. Dans vos formulaires Blade, utilisez toujours @csrf. Pour les requêtes JavaScript (fetch, Axios), incluez le token dans les headers X-XSRF-TOKEN. N'ajoutez jamais une route à la liste $except de VerifyCsrfToken sans raison explicite et documentée — les webhooks entrants (qui ne peuvent pas inclure un token CSRF) sont la seule exception légitime, et ils doivent être protégés par signature HMAC à la place.

2. XSS : Blade vous protège, mais pas aveuglément

La syntaxe {{ $variable }} de Blade échappe automatiquement le HTML. C'est suffisant pour 95 % des cas. Le danger vient de {!! $variable !!} (rendu HTML brut) — qui ne doit jamais être utilisé avec des données non vérifiées provenant d'un utilisateur. Si vous devez afficher du HTML riche (éditeur WYSIWYG), nettoyez le HTML avec une bibliothèque comme mews/purifier (HTMLPurifier) avant de le stocker et avant de l'afficher.

3. Validation stricte côté serveur : jamais optionnelle

La validation JavaScript côté client est du confort UX, pas de la sécurité. Un attaquant peut désactiver JavaScript ou envoyer des requêtes directes. Chaque Form Request Laravel doit valider chaque champ avec des règles précises : type, format, taille maximale, valeurs autorisées (enum). Pour les champs de recherche ou de filtre, assurez-vous qu'ils passent par Eloquent et non par une concaténation de chaîne SQL — Eloquent paramétrise automatiquement toutes les requêtes, protégeant contre les injections SQL.

4. Gestion des uploads : le vecteur le plus dangereux

Les uploads de fichiers sont la surface d'attaque la plus risquée. Voici le protocole ObiDevTech :

  • Valider le type MIME réel (pas juste l'extension) avec 'mimes:jpg,png,pdf' et/ou finfo_file()
  • Limiter la taille avec 'max:5120' (5 Mo) — ne jamais faire confiance à la limite côté client
  • Renommer systématiquement le fichier avec un UUID ou un hash — jamais conserver le nom original
  • Stocker en dehors du webroot public (storage/app/private/) et servir via une route contrôlée avec vérification des droits
  • Ne jamais servir les fichiers uploadés depuis public/uploads/ sans contrôle d'accès

5. Headers HTTP sécurité : la dernière ligne de défense

Ajoutez ces headers dans votre configuration Nginx ou via un middleware Laravel : X-Content-Type-Options: nosniff, X-Frame-Options: SAMEORIGIN, X-XSS-Protection: 1; mode=block, Referrer-Policy: strict-origin-when-cross-origin, et une Content-Security-Policy adaptée à votre application (plus complexe à configurer, mais très efficace contre les XSS avancés). Ces headers ne remplacent pas la validation et l'échappement, mais ajoutent une couche de protection supplémentaire côté navigateur.

Conclusion

La sécurité n'est pas une fonctionnalité à ajouter en fin de projet — c'est une discipline à intégrer dès la conception. Ces 5 pratiques couvrent l'essentiel des vecteurs d'attaque courants sur les formulaires Laravel. Pour les applications traitant des données sensibles (paiements, informations personnelles), un audit de sécurité dédié reste recommandé avant la mise en production.

Poursuivre la lecture

Articles similaires

D’autres contenus qui pourraient vous intéresser

Voir tout le blog