Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Valider les données saisies par l'utilisateur

Après cette leçon: Je peux vérifier une entrée avant que le programme lui fasse confiance, avec une liste permise, une longueur et un type.

Leçon de 55 min1 commandeLab d’injection SQL : attaquer une recherche faible, corriger la requête et prouver la correction

Pourquoi vérifier ce que l'utilisateur saisit ?

Valider une entrée, c'est vérifier qu'une donnée venue de l'extérieur a la bonne forme avant que le programme s'en serve. Une quantité doit être un nombre, un code postal doit avoir cinq chiffres.

C'est la première défense contre beaucoup d'attaques. Une donnée refusée à la porte ne peut rien casser plus loin dans le programme.

À la fin de cette leçon

Remarque

Je peux vérifier une entrée avant que le programme lui fasse confiance, avec une liste permise, une longueur et un type.

Mots-clés

MotCe que ça veut direExemple
Validationle contrôle qu'une donnée a la forme attendue avant de l'utiliser
Liste permisela liste des valeurs acceptées : tout le reste est refusé["France", "Belgique"]
Liste interditela liste des valeurs refusées : tout le reste passe, ce qui est risqué
Typela nature d'une donnée : un nombre, du texte, une date
Longueurle nombre de caractères d'un texte
Côté serveurdans le programme que le visiteur ne contrôle pas, par opposition à la page dans son navigateur

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

La règle unique

Attention

Ce laboratoire est une boutique volontairement fragile. Regardez votre copie privée, et rien d'autre : elle n'a aucune sortie vers Internet. Tester un système qui n'est pas le vôtre, ou sans permission, est un délit dans presque tous les pays.

Une liste permise vaut mieux qu'une liste interdite

Il y a deux façons de vérifier. Une liste interdite refuse les valeurs dangereuses connues. Une liste permise n'accepte que les valeurs prévues.

La liste interdite oublie toujours un cas : personne ne connaît toutes les attaques. La liste permise est plus courte à écrire et plus sûre, car ce qu'on n'a pas prévu est refusé.

Exemple travaillé : un formulaire de commande

ChampCe qui est permisExemple acceptéExemple refusé
quantitéUn nombre entier de 1 à 1030, 11, trois, 2,5
code postalExactement 5 chiffres750117501, 75O11, 750112
paysUn mot de la liste France, Belgique, SuisseBelgiqueMars
nomDe 1 à 40 caractères, hors espaces autourCamille RouxUn champ vide

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

La vérification se fait côté serveur

Un formulaire peut vérifier une saisie dans le navigateur. C'est agréable pour le visiteur : il voit l'erreur tout de suite. Ce n'est pas une protection.

Un attaquant n'utilise pas votre page. Il envoie directement sa demande au serveur, sans passer par le formulaire. Le serveur doit donc refaire chaque contrôle lui-même.

Que laisse passer la recherche de la boutique ?

La boutique du laboratoire ne vérifie rien : un terme vide est accepté, et elle répond avec tous les produits en vente. Démarrez le laboratoire, puis lancez cette commande qui regarde seulement.

Elle envoie une recherche vide et compte les lignes de la réponse. Un contrôle de longueur minimale aurait refusé cette demande.

Une recherche vide est acceptée

Commande
curl -s "http://app:8000/search?q=" | wc -l

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Une longueur maximale protège aussi

Un texte très long peut ralentir un programme ou remplir son espace de stockage. Une longueur maximale est donc un contrôle de sécurité, pas seulement de confort.

Choisissez la limite d'après l'usage réel. Un nom de famille tient en 40 caractères, un code postal en 5. Une limite trop large ne protège rien.

Contrôler une longueur et un type

Code: python
# Changez saisie, puis relancez : "5", "12", "abc", "".
saisie = "12"
if len(saisie) == 0 or len(saisie) > 2:
    print("longueur refusée")
elif not saisie.isdigit():
    print("ce n'est pas un nombre")
elif int(saisie) < 1 or int(saisie) > 10:
    print("hors de l'intervalle de 1 à 10")
else:
    print("quantité acceptée :", int(saisie))

Un refus clair, sans détail dangereux

Quand une saisie est refusée, dites au visiteur quel champ pose problème et ce qu'on attend. « Le code postal doit avoir 5 chiffres » est utile et sans danger.

N'affichez pas la règle interne ni l'erreur brute du programme. Ces détails aident un attaquant à comprendre comment le site fonctionne.

Une erreur fréquente

Attention

Beaucoup pensent que valider une entrée suffit à stopper une injection. C'est faux : un nom comme O'Brien est valide et contient pourtant une apostrophe. La validation réduit les entrées possibles. Elle ne remplace pas la requête paramétrée, vue à la leçon suivante.

À propos de ce labo et de sa source: Lab d’injection SQL : attaquer une recherche faible, corriger la requête et prouver la correction

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.