Valider un formulaire côté serveur avec PHP

La validation d'un formulaire Web est une tâche complexe. Il faut en effet s'assurer que les données entrées par l'usager correspondent au format attendu, qu'elles soient valables et qu'elles ne compromettent pas la sécurité du site Web.

Normalement, une fois que l'usager a cliqué sur le bouton de soumission, les données entrées devraient être valides puisque la validation a déjà été effectuée côté client. Cependant, comme cette validation peut être désactivée, il est absolument nécessaire de refaire la validation côté serveur.

Voici les étapes permettant de bien valider les données d'un formulaire avec PHP.

▼Publicité

Valider le format attendu

  • Pour chaque information obligatoire, vérifier si elle n'est pas vide.

    Ex :

    PHP

    $age = $_POST['age'];

     

    if ('' == $age) {

        $message .= 'L\'âge est requis.<br \>';

    }

  • Pour chaque information présentant un format de saisie, vérifier si elle contient le bon format.

    Ex :

    PHP

    $codepostal = $_POST['codepostal'];

     

    if (!preg_match("^[ABCEGHJKLMNPRSTVXYabceghjklmnprstvxy][0-9][ABCEGHJKLMNPRSTVWXYZabceghjklmnprstvwxyz] ?[0-9][ABCEGHJKLMNPRSTVWXYZabceghjklmnprstvwxyz][0-9]$", $codepostal)) {

        $message .= 'Le code postal n\'est pas valide. Exemple de format valide : A9A 9A9. Certaines lettres ne peuvent pas faire partie du code postal.<br \>';

    }

  • S'assurer que chacune des validations côté client soit correctement reprise côté serveur.

    Ex : pour le code HTML suivant :

    HTML

    <input type="text" id="code" name="code" maxlength="10" />

    On devra vérifier à nouveau la longueur côté serveur :

    PHP

    $code = $_POST['code'];

     

    if (strlen($code) > 10) {

        $message .= 'Le code ne peut pas comporter plus de 10 caractères.<br />';

    }

Si au moins une erreur est détectée

Si au moins une erreur est détectée, il faut afficher un message d'erreur puis permettre à l'usager de corriger la situation.

Le message doit indiquer clairement chacune des erreurs rencontrées.

Ex :

PHP

if ('' != $message) {

    echo "<p class='messageerreur'>$message</p>";

}

Si aucune erreur n'est détectée

Dans le cas où les informations saisies doivent être enregistrées dans la base de données, les vérifications doivent se poursuivre avant de procéder à un enregistrement sécuritaire.

Valider que les données sont valables

Une donnée sera valable si elle correspond à une valeur acceptée. Pour vous assurer que les données soient valables :

  • Pour chaque information numérique, s'assurer que la valeur entrée est effectivement numérique. On peut également procéder simplement à une conversion de type.

    Ex :

    PHP

    $quantite = intval($_POST['quantite']);

  • Les informations choisies dans une liste déroulante pourraient avoir été falsifiées par un usager malveillant. Il faut donc s'assurer que la valeur à enregistrer soit valable.

    Si les valeurs de la liste déroulante sont prédéfinies dans le code :

    PHP

    $valeursAppreciation = array(0, 1, 2, 3, 4);

     

    if (!in_array($_POST['appreciation'], $valeursAppreciation)) {

        $message .= 'L\'appréciation ne correspond pas à un choix valable.<br />';

    }

    Si les valeurs de la liste déroulante sont tirée de la base de données :

    PHP

    $categorie = intval($_POST['categorie']);

    $categorieValide = false;

     

    $requete = "SELECT categorie_id FROM categorie";

    $resultat = $mysqli->query($requete);

     

    if ($resultat) {

        while ($enreg = $resultat->fetch_row()) {

            if ($categorie == $enreg[0]) {

                $categorieValide = true;

                break;

            }

        }

    }

     

    if (!$categorieValide) {

        $message .= 'La catégorie ne correspond pas à un choix valable.<br />';

    }

Enregistrer les données sans compromettre la sécurité

Avant de procéder à l'enregistrement des données, il est important de sécuriser le code afin de limiter les risques que les informations entrées par l'usager soient la source d'une attaque (en anglais, on dira « sanitize input »). Ainsi, une fois que nous nous sommes assurés que les données correspondent au format attendu et qu'elles sont valables, il faut les désinfecter.

Même s'il est possible d'effectuer certaines opérations de désinfection manuellement (ex : addslashes()), il est absolument nécessaire de travailler avec les requêtes préparées pour assurer que les données soient correctement désinfectées avant l'enregistrement.

Et, bien important, un message devra indiquer à l'usager si l'opération a été réussie ou non.

Ex :

PHP

$requete = "INSERT INTO client(client_prenom, client_nomfamille) VALUES(?, ?)";

$stmt = $mysqli->prepare($requete);

 

if ($stmt) {

 

    $stmt->bind_param("ss", $prenom, $nomfamille);

 

    $stmt->execute();

 

    if ($stmt->affected_rows == -1) {

        echo "<div class='messageerreur'>Nous sommes désolés, un problème technique nous empêche d'enregistrer le client (code 1).</div>";

    }

    else {

        echo "<div class='messageinformation'>Le client a été ajouté avec succès !</div>";

    }

 

    $stmt->close();

}

else {

    echo "<div class='messageerreur'>Nous sommes désolés, un problème technique nous empêche d'enregistrer le client (code 2).</div>";

}

Merci de partager ! Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInPin on PinterestShare on StumbleUponEmail this to someone
Catégories