Tutoriel Vidéo PHP Middleware CSRF PSR-15

Télécharger la vidéo Voir la démo

Dans cette vidéo je vous propose de découvrir comment créer une librairie en utilisant le principe du TDD et comment la publier sur packagist pour la rendre publiquement accessible sur packagist.

  • 00:00 Création de la library en utilisant le TDD
  • 37:46 Utilisation d'un Code Sniffer
  • 40:38 PHP CS Fixer
  • 43:53 Publier sur Github
  • 48:57 Travis CI, Intégration continue
  • 52:33 Code Coverage
  • 58:15 Publication sur packagist

Qu'est que le CSRF

CSRF, pour Cross-Site Request Forgery consiste à faire éxécuter une requête HTTP falsifiée à un utilisateur afin de le rediriger vers une action interne au site.

Par exemple, une personne mal intentionnée crée sur son site un formulaire qui ressemble à ça :

<form action="http://grafikart.fr/account/delete" method="POST">
  <button>
    Vous avez gagné un ipad !
  </button>
</form>

Un utilisateur, authentifié sur grafikart.fr, qui se rend sur ce site, et qui clique sur ce bouton, verra alors son compte supprimé.

Comment se protéger ?

Une première protection consiste à vérifier dans les en-têtes que la personne vient bien de votre site en vérifiant la valeur de $_SERVER['HTTP_Referrer']. Mais cette vérification ne vous protège que partiellement (par exemple si une personne arrive à injecter du JavaScript sur votre site, il peut alors tromper le serveur avec une requête Ajax).

Pour mieux se protéger on peut utiliser un système de token :

  • Lorsque l'on génère un formulaire, on génère une clef qui sera sauvegardée en session.
  • Cette clef est mise dans un champs caché <input type="hidden" name="_csrf" value="<?php .... ?>"
  • Lorsque le serveur reçoit une requête avec une méthode POST, DELETE ou PUT il va vérifier que la clef soumise dans le formulaire correspond à celle stockée en session.
  • Si la clef correspond, le formulaire peut être traité et la clef supprimée afin d'éviter l'envoie du même formulaire plusieurs fois.

Afin de mettre en place cette sécurité, nous allons créer un middleware en utilisant l'interface http-interop. Ce middleware pourra être placé globalement pour protéger la totalité de notre application.