La validation de données autres que des nombres est la chose la plus difficile, sauf si la chaîne doit obéir à un masque clairement identifié comme par exemple un code composé de 2 lettres majuscules, suivies d'un nombre à 3 chiffres, puis d'un tiret et de 3 lettres minuscules. Dans la réalité il est difficile de trouver de telles modèles que l'on pourra traiter facilement avec des expressions régulières (voir le chapitre qui leur est consacré).

Donc à défaut de pouvoir appliquer un masque de validation à une chaîne de caractères, les tests minimums vont consister à :

- enlever les espaces blancs éventuels avant et après la chaîne
- vérifier que la chaîne n'est pas vide (sauf si il est possible de ne rien saisir dans la zone)
- si des limitations existent, vérifier que la chaîne est d'une longueur minimum et/ou maximum
- enlever les tags HTML que l'utilisateur aurait pu glisser dans la chaîne pour effectuer par exemple une attaque XSS (cross-site scripting)

Formulaire HTML côté client

Nom Identifiant Cursus
Année L2 L3 M1 M2 Langage préféré
Aimerait plus de cours magistraux
plus de cours en ligne
plus de TD
plus de TP

Dans notre formulaire d'exemple nous attendons que 4 zones contiennent des valeurs alphanumériques :

- le nom,
- le cursus,
- le langage préféré,
- ce que l'étudiant aimerait en plus.

Il pourrait sembler surprenant de tester la valeur reçue pour le langage préféré et ce que l'étudiant aimerait le plus car cette valeur n'est pas saisie, mais résulte du choix dans une liste déroulante ou du choix de telle ou telle case à cocher. Nous sommes dans le même cas que celui des boutons radio vu précédemment : ce test est obligatoire, car rien n'empêche la personne qui va envoyer le formulaire de modifier facilement les valeurs correspondantes à ces zones avec les outils offerts par les navigateurs.

Commençons par le nom qui doit être constitué de 2 à 50 caractères. Le test est très simple.

Exemple de valeurs libres

Nom
Traitement du formulaire côté serveur
<?php require('bib_fonctions.php'); htmlDebut('Valider une chaîne de caractères'); htmlInfo('Test du nom'); $nom = trim($_POST['txtNom']); $long = strlen($nom); if ($long < 2 || $long > 50) { echo 'Mauvaise longueur'; } else { echo 'Longueur Ok'; } htmlFin(); ?>

On ne peut pas vraiment tester autre chose sur un nom, à part peut-être obliger à ce que le premier caractère soit un caractére majuscule. La suite est trop aléatoire, tant les noms patronymique peuvent changer d'une société à une autres (présence de tiret, d'apostrophe, d'espaces, etc.).

Nous allons maintenant enlever les tags HTML que l'utilisateur aurait pu glisser dans la chaîne pour effectuer par exemple une attaque XSS (cross-site scripting). Pour vous rendre compte de ce problème, dans le formulaire suivant saisissez :
<img src="http://www.deguisement.fr/img/p-deguisement.fr/232-309-thickbox.jpg">
puis soumettez le formulaire.

Vous pouvez aussi saisir par exemple :
<script>location="http://google.fr"</script>

Exemple de valeurs libres

Nom
Traitement du formulaire côté serveur
<?php require('bib_fonctions.php'); htmlDebut('Code inclus et exécuté au réaffichage'); htmlInfo('Cross-site scripting simplifié'); $nom = $_POST['txtNom']; echo $nom; htmlFin(); ?>

Le simple affichage du champ reçue du formulaire provoque l'exécution du code saisi par l'utilisateur. Si on imagine un site qui laisse ses visiteurs saisir des commentaires, ou des posts dans un forum, avec un tel trou de sécurité, chaque fois qu'un autre utilsateur voudra lire le commentaire ou le post, le code sera exécuté dans son navigateur. A la place de l'adresse "univ-fcomte.fr" on pourrait aisément avoir l'adresse d'une page qui permette de pirater login et mot de passe en proposant une imitation de la vraie page du site.

La fonction strip_tags() va enlever tout ou partie des tags HTML qui pourrait être contenu dans un texte. Même si certains tags peuvent sembler inoffencifs à première vue, je vous conseille de systématiquement enlever tous les tags.

Exemple de valeurs libres

Nom
Traitement du formulaire côté serveur
<?php require('bib_fonctions.php'); htmlDebut('Valider une chaîne de caractères'); htmlInfo('Test du nom'); $nom = trim($_POST['txtNom']); $long = strlen($nom); if ($long < 2 || $long > 50) { echo 'Mauvaise longueur'; } else { echo 'Longueur Ok'; } $clean = strip_tags($nom); if ($clean != $nom) { echo '<br>Surveiller adresse IP, tentative de XSS ?'; } else { echo '<br>Pas de tags, Ok'; } htmlFin(); ?>