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
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Validation | le contrôle qu'une donnée a la forme attendue avant de l'utiliser | |
| Liste permise | la liste des valeurs acceptées : tout le reste est refusé | ["France", "Belgique"] |
| Liste interdite | la liste des valeurs refusées : tout le reste passe, ce qui est risqué | |
| Type | la nature d'une donnée : un nombre, du texte, une date | |
| Longueur | le nombre de caractères d'un texte | |
| Côté serveur | dans 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
| Champ | Ce qui est permis | Exemple accepté | Exemple refusé |
|---|---|---|---|
| quantité | Un nombre entier de 1 à 10 | 3 | 0, 11, trois, 2,5 |
| code postal | Exactement 5 chiffres | 75011 | 7501, 75O11, 750112 |
| pays | Un mot de la liste France, Belgique, Suisse | Belgique | Mars |
| nom | De 1 à 40 caractères, hors espaces autour | Camille Roux | Un 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
curl -s "http://app:8000/search?q=" | wc -lAffiché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
# 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.