Cours

PHP Leçon 5

Formulaires et sécurité

Récupérer ce que le visiteur tape dans un formulaire, et l'afficher sans ouvrir de faille.

25 min

À la fin de cette leçon, tu sauras

  • Créer un formulaire HTML qui envoie des données
  • Récupérer les valeurs avec $_POST
  • Protéger l'affichage avec htmlspecialchars

Le formulaire HTML

Un formulaire envoie ce que le visiteur a tapé vers une page PHP. action dit quelle page reçoit les données, method="post" les envoie de façon discrète (pas dans l'adresse). Chaque champ a un attribut name : c'est son nom côté PHP.

<form action="bonjour.php" method="post">
  <label for="prenom">Ton prénom</label>
  <input id="prenom" name="prenom" type="text" required>
  <button type="submit">Envoyer</button>
</form>

Le <label> relié au champ (for = id) n'est pas décoratif : cliquer dessus active le champ, et les lecteurs d'écran l'annoncent.

Récupérer les données : $_POST

Dans bonjour.php, PHP range tout ce qui a été envoyé dans un tableau associatif spécial : $_POST. La clé est le name du champ.

<?php
$prenom = $_POST["prenom"] ?? "";

if ($prenom === "") {
    echo "Tu n'as pas donné ton prénom.";
} else {
    echo "Bonjour " . htmlspecialchars($prenom) . " !";
}

L'opérateur ?? donne une valeur par défaut (ici un texte vide) si le champ n'existe pas, par exemple quand quelqu'un ouvre la page directement sans passer par le formulaire. Sans ça, PHP afficherait un avertissement.

La règle d'or : ne jamais faire confiance à ce qu'envoie le visiteur

Imagine que quelqu'un tape ceci comme prénom : <script>…</script>. Si tu l'affiches tel quel, le navigateur exécute ce script dans ta page, chez tous ceux qui la voient. Cette faille s'appelle le XSS, et c'est l'une des plus courantes sur le web.

htmlspecialchars() transforme les caractères dangereux (<, >, "…) en texte inoffensif. Le visiteur voit ce qu'il a tapé, mais rien ne s'exécute.

Attention : passe toujours par htmlspecialchars() pour afficher une donnée venue d'un formulaire, d'une adresse ou d'une base de données. Et vérifie aussi les données côté serveur : l'attribut required du HTML se contourne très facilement.

À toi de jouer

Le formulaire envoie un champ nommé ville. Écris le code PHP qui :

  • récupère $_POST["ville"] dans une variable $ville, avec ?? "" comme valeur par défaut ;
  • affiche « Tu habites à … » en protégeant la ville avec htmlspecialchars().
index.php
  • $ville récupère $_POST["ville"]
  • Une valeur par défaut est prévue avec ??
  • L'affichage passe par htmlspecialchars($ville)
  • $ville n'est jamais affichée sans protection
Bloqué ? Voir une solution
<?php
$ville = $_POST["ville"] ?? "";

echo "Tu habites à " . htmlspecialchars($ville);

Quiz

1Le champ <input name="email"> est envoyé en POST. Comment le lire en PHP ?
2À quoi sert htmlspecialchars() ?
3Que vaut $_POST["age"] ?? 0 si le champ age n'a pas été envoyé ?