Pas de piège dans les annonces

Exercice 5 sur 7 du chapitre 6 · 200 XP · 4 objectifs vérifiés par des tests

Notions abordées : XSShtmlspecialcharsValidationis_string

Léo a trouvé un nouveau jeu. Dans le titre d'une annonce, il a tapé "><script>alert('Léo')</script> en laissant le contact vide. Le formulaire est revenu avec ses erreurs… et une fenêtre « Léo » a surgi : son texte est devenu du code, exécuté par le navigateur. C'est une faille XSS (cross-site scripting). Avec un vrai script, Léo pourrait faire faire n'importe quoi à la page de quelqu'un d'autre, en lui envoyant simplement un lien ou un formulaire piégé.

Votre mission

  1. Dans templates/proposer-annonce.php, échappez chaque valeur saisie avec htmlspecialchars() : les trois champs, et les erreurs, qui répètent le prix saisi.
  2. Léo a un second tour dans son sac : en envoyant titre[]=x, il fait arriver un tableau au lieu d'une chaîne, et la page plante. Dans public/index.php, n'acceptez que des chaînes : un champ qui n'en est pas une compte comme vide.

Rappel

Tout ce qui vient de l'extérieur (formulaire, adresse, cookie) est une entrée non fiable. On la vérifie en entrant (is_string(), ctype_digit()), et on l'échappe en sortant, au moment de l'afficher dans du HTML (htmlspecialchars()). Les deux sont nécessaires : la validation ne connaît pas le HTML, et l'échappement ne sait pas ce qu'est un prix.

Pour remplacer une valeur qui ne convient pas, l'opérateur ternaire évite un if complet : condition ? valeurSiVrai : valeurSiFaux. Par exemple, is_string($valeur) ? trim($valeur) : '' donne la valeur nettoyée si c'est une chaîne, et '' sinon.