Documentation · Chapitre 04

Protéger le formulaire
par couches.

La sécurité n’est pas une seule fonction. Elle combine l’intention de la requête, la validation, l’échappement et les protections automatiques du framework.

Nous poursuivons le projet reading-list. Les données seront conservées dans la session avant d’introduire une base de données.

CSRF : empêcher une autre page d’agir à votre place

Une attaque CSRF tente de faire envoyer à votre navigateur une action que vous n’avez pas décidée. PHPAML associe un jeton secret à votre session. Le formulaire l’envoie et le middleware vérifie qu’il correspond avant de laisser passer POST.

phpaml — zsh
<form method="post" action="/books">
    <?= $view->csrfField() ?>
    <!-- champs -->
</form>

Dans une application classique actuelle, CsrfMiddleware est ajouté automatiquement. Un jeton absent ou incorrect reçoit 419. Ne désactivez pas cette protection pour corriger un formulaire : ajoutez le champ attendu.

Validation et échappement résolvent deux problèmes différents

VALIDATION

Décide si une valeur est acceptable pour votre application : longueur, type, présence, format.

ÉCHAPPEMENT

Empêche une valeur affichée d’être interprétée comme une balise ou un script HTML.

phpaml — zsh
<?= $view->escape($book['title']) ?>

Les protections déjà actives

CSRF

Vérifie les requêtes qui modifient.

Limitation de débit

Freine les envois répétés sur POST, PUT, PATCH et DELETE.

En-têtes de sécurité

Durcissent le comportement du navigateur.

Redirections internes

Response refuse les destinations externes ou mal formées.

Test de sécurité simple

  1. Soumettez normalement le formulaire : il doit réussir.
  2. Inspectez la page et retirez temporairement le champ _token.
  3. Soumettez de nouveau : PHPAML doit répondre 419.
  4. Rétablissez csrfField() et vérifiez le succès.
Ne journalisez jamais le jeton

Un jeton CSRF est une valeur de sécurité liée à la session. Ne l’affichez pas dans une erreur publique et ne le copiez pas dans un rapport.