Documentation · Chapitre 08

Valider à l’entrée,
échapper à la sortie.

Ces opérations répondent à deux questions différentes : la donnée est-elle acceptable, puis peut-elle être affichée sans devenir du code HTML ?

Nous sécurisons reading-list par couches, sans prétendre qu’une seule option suffit.

La validation protège les règles

phpaml — zsh
$validator = new Validator();

$valid = $validator->validate($request->input(), [
    'title' => ['required', 'string', 'min:2', 'max:180'],
    'author' => ['required', 'string', 'min:2', 'max:120'],
]);

if (!$valid) {
    return $this->view('books/create.php', [
        'errors' => $validator->errors(),
        'old' => $request->input(),
    ], 422);
}

required vérifie la présence, string le type, min et max la longueur. PHPAML fournit aussi email, url, uuid, integer, numeric, boolean, date, in, same, confirmed, regex, unique et exists.

L’échappement protège le document

phpaml — zsh
<!-- Mauvais : le contenu peut devenir du HTML -->
<h1><?= $book->title ?></h1>

<!-- Bon : le contenu reste du texte -->
<h1><?= $view->escape($book->title) ?></h1>

Un titre comme <script>…</script> doit être affiché littéralement, jamais exécuté. Échappez au moment de produire la sortie HTML, car le bon encodage dépend du contexte de sortie.

Ne corrigez pas silencieusement une entrée invalide

trim() peut enlever des espaces involontaires, mais transformer une valeur incorrecte sans avertir risque de changer le sens choisi par l’utilisateur. Conservez les anciennes valeurs sûres, affichez les erreurs près des champs et renvoyez 422.

Vérifiez votre compréhension : La validation remplace-t-elle escape() ?

Non. Un titre contenant certains caractères HTML peut être valide comme donnée, mais doit toujours être échappé lors de son affichage.