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.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. 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.