Le typage des saisies
Toute saisie arrive en chaîne : conversion explicite vers le type attendu, comparaison stricte, liste blanche de valeurs, rejet plutôt que réparation, et les pièges de la comparaison lâche.
- 23 cartes
- 4 thèmes
- Gratuit
Le programme, thème par thème
Le poids de chaque thème suit celui que lui donne l'examen.
- Notions
- Questions
- Ranger et relier
- Mises en situation
Quelques cartes du deck
Validation d'une saisie : de quoi s'agit-il ?
Voir la réponse
Contrôle, côté serveur, qu'une valeur reçue a la forme et le type attendus avant qu'on s'en serve.
Tout ce qui arrive du client est modifiable : le contrôle du navigateur améliore la saisie, mais seul celui du serveur protège. Une valeur invalide est rejetée, pas réparée en silence.
En PHP 8, que vaut l'expression suivante ?
```php
var_dump("10" == "1e1");`- bool(true)
- bool(false)
- int(10)
- Warning: A non-numeric value
Voir la réponse
bool(true)
Quand les deux opérandes sont des chaînes numériques, == les compare comme des nombres : 10 et 1e1 (soit 10) sont égaux. Avec ===, le résultat est false, car les chaînes diffèrent.
En HTTP, toute valeur de formulaire ou d'URL arrive au serveur sous forme de … de caractères, même quand elle représente un nombre.
Voir la réponse
En HTTP, toute valeur de formulaire ou d'URL arrive au serveur sous forme de chaîne de caractères, même quand elle représente un nombre.
$_GET['page'] vaut la chaîne '3', pas l'entier 3. Le programme doit la convertir et la contrôler lui-même avant de s'en servir.
Conversion implicite : de quoi s'agit-il ?
Voir la réponse
Changement de type effectué automatiquement par le langage pour comparer ou combiner deux valeurs de types différents.
Elle donne des résultats surprenants : en PHP 8, '10' == '1e1' vaut true parce que les deux chaînes sont lues comme des nombres. Un opérateur strict (===) ne convertit jamais.
La page liste.php?page=abc fait planter la requête SQL qui calcule le décalage (page - 1) * 20. Quelles sont la cause et la solution ?
- La base est trop lente : ajouter un index sur la colonne triée par la requête SQL
- Le navigateur envoie mal le paramètre : changer GET en POST dans le formulaire
- La saisie n'est jamais convertie : la valider comme entier borné, sinon répondre 400
- Le serveur manque de mémoire : augmenter la limite de mémoire de PHP dans la configuration
Voir la réponse
La saisie n'est jamais convertie : la valider comme entier borné, sinon répondre 400
La chaîne 'abc' est calculée comme un nombre ou collée dans la requête sans contrôle. Il faut convertir en entier, borner (au moins 1, au plus le nombre de pages) et, si c'est impossible, refuser avec un code 400 plutôt que de deviner.