PHP Formulaire d’inscription

Complétez les codes PHP ci-dessous pour maîtriser les concepts essentiels et sécuriser vos formulaires. Chaque exercice peut être copié et adapté selon vos besoins.

Variables

Continuer les exercices du cours étapes par étapes.

INTERMÉDIAIRE

Objectif : continuer la suite et récupérer le code

Etape 1

<?php
// POURQUOI ? Empêcher l'accès direct au fichier via GET
// SANS ÇA ? Quelqu'un pourrait accéder à process.php directement dans son navigateur
// EXEMPLE D'ATTAQUE : Un utilisateur tape "monsite.com/process.php" et pourrait voir des erreurs ou du code
if ($_SERVER["REQUEST_METHOD"] ==) {

    foreach ($champs_obligatoires as $champ) {
      if (!isset($_POST[$champ]) || empty($_POST[$champ])) {
    die("Erreur : Le champ '$champ' est obligatoire.");
      }
    }

    $nom_complet = $_POST['nom_complet'];
    $email =;
    $mot_de_passe = $_POST[];
    $confirmation_mot_de_passe = $_POST[];
    $role =;
    $phone = $_POST[];
    $terms = $_POST[];
    $form_id = $_POST[];

    echo "Voici votre nom que j'ai récupéré : " .. "<br />";
    echo "Voici votre email que j'ai récupéré : " . $email . "<br />";
    echo "Voici votre mot de passe que j'ai récupéré : " .. "<br />";
    echo. $confirmation_mot_de_passe . "<br />";
    echo "Voici votre rôle que j'ai récupéré : " .. "<br />";
    echo "Voici votre téléphone que j'ai récupéré : " . $phone . "<br />";
    echo "Voici votre acceptation des conditions que j'ai récupéré : " .. "<br />";
    echo "Voici votre form_id que j'ai récupéré : " . $form_id . "<br />";
}
?>

13 trous à compléter. Vos réponses sont conservées dans ce navigateur ; elles ne sont ni corrigées ni envoyées.

Indice

Utilisez $_POST['nom_du_champ'] pour récupérer les données. Les noms des champs correspondent aux attributs name du formulaire HTML

INTERMÉDIAIRE

Objectif : nettoyage de données

Etape 2

<?php
// Récupération et nettoyage sécurisé des données POST

    $nom_complet =;
    $email = nettoyer_donnee($_POST[]);
    $mot_de_passe = nettoyer_donnee(); // On ne nettoie pas le mot de passe pour préserver les caractères spéciaux
    $confirmation_mot_de_passe =; // On ne nettoie pas le mot de passe pour préserver les caractères spéciaux
    $role = $_POST[]; // Pas de nettoyage nécessaire car l'utilisateur ne rentre pas de donnée
    $phone =;
    $terms = $_POST[]; // Checkbox = pas de nettoyage
    $form_id =; // ID = pas de nettoyage

8 trous à compléter. Vos réponses sont conservées dans ce navigateur ; elles ne sont ni corrigées ni envoyées.

Code tout prêt

Cette section vous donne des morceaux de codes que nous allons expliqués et utiliser pour sécuriser notre formulaire.

INTERMÉDIAIRE

Objectif : continuer la suite et récupérer le code

php

<?php
// POURQUOI ? Empêcher l'injection de code malveillant et s'assurer de la validité des données
// SANS ÇA ? Un pirate pourrait injecter du JavaScript, du HTML malveillant ou des scripts PHP

// Fonction de nettoyage personnalisée
function nettoyer_donnee($donnee) {
    // trim() : supprime les espaces en début/fin
    // stripslashes() : supprime les antislashs ajoutés automatiquement
    // htmlspecialchars() : convertit les caractères spéciaux en entités HTML
    return htmlspecialchars(stripslashes(trim($donnee)));
}
?>

Indice

<div> supprime les espaces en début et fin de chaîne pour éviter les données parasites.

INTERMÉDIAIRE

Objectif : continuer la suite et récupérer le code

php

<?php
// Fonction de validation de longueur
function valider_longueur($donnee, $min, $max, $nom_champ) {
    $longueur = strlen($donnee);
    if ($longueur $min || $longueur > $max) {
        die("Erreur : Le champ '$nom_champ' doit contenir entre $min et $max caractères.");
    }
    return true;
}
?>

Indice

<code>strlen()</code> retourne le nombre de caractères dans une chaîne de caractères. Par exemple : <code>strlen("Bonjour")</code> retourne 7. <div>Cette fonction est essentielle pour valider la longueur des mots de passe, noms d'utilisateur, ou tout autre champ avec des contraintes de taille.

INTERMÉDIAIRE

Objectif : continuer la suite et récupérer le code

php

<?php
// Vérification de l'existence des champs obligatoires
$champs_obligatoires = ['nom_complet', 'email', 'mot_de_passe', 'confirmation_mot_de_passe', 'role', 'terms', 'form_id'];
foreach ($champs_obligatoires as $champ) {
    if (!isset($_POST[$champ]) || empty($_POST[$champ])) {
        die("Erreur : Le champ '$champ' est obligatoire.");
    }
}
?>

Indice

<code>isset()</code> vérifie si une variable existe et n'est pas <code>null</code>. Elle retourne <code>true</code> si la variable est définie, <code>false</code> sinon. <div>Par exemple : <code>isset($_POST['email'])</code> retourne <code>true</code> si le champ email a été envoyé par le formulaire.

INTERMÉDIAIRE

Objectif : Apprendre à l'utiliser et récupérer le code

php

<?php
// Validation du nom complet
// POURQUOI ? Empêcher les noms trop courts ou trop longs qui pourraient casser la base de données
// EXEMPLE SANS ÇA : Quelqu'un pourrait entrer un nom de 10000 caractères et saturer votre stockage
valider_longueur($nom_complet, 2, 100, 'nom complet');
?>

Indice

<code>valider_longueur($donnee, $min, $max, $nom_champ)</code> <div> Le texte à valider (par exemple, un nom complet, un email, etc.)

INTERMÉDIAIRE

Objectif : Apprendre à l'utiliser et récupérer le code

php

<?php
// Validation de l'adresse email
// POURQUOI ? S'assurer que l'email est valide pour pouvoir contacter l'utilisateur
// SANS ÇA ? Des emails invalides comme "abc@" ou "test..@example" seraient acceptés
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    die('Erreur : Adresse email invalide.');
}
?>

Indice

<code>filter_var($email, FILTER_VALIDATE_EMAIL)</code> <div> La chaîne à valider (exemple : "user@domain.com")

INTERMÉDIAIRE

Objectif : Apprendre à l'utiliser et récupérer le code

php

<?php
// Validation du mot de passe
// POURQUOI ? S'assurer que le mot de passe est suffisamment sécurisé
// SANS ÇA ? Des mots de passe comme "123" seraient acceptés, facilitant le piratage
if (strlen($mot_de_passe) < 8) {
    die('Erreur : Le mot de passe doit contenir au moins 8 caractères.');
}

// Vérification que les mots de passe correspondent
// POURQUOI ? Éviter les erreurs de frappe qui empêcheraient l'utilisateur de se connecter
// SANS ÇA ? L'utilisateur pourrait créer un compte avec un mot de passe qu'il ne connaît pas
if ($mot_de_passe !== $confirmation_mot_de_passe) {
    die('Erreur : Les mots de passe ne correspondent pas.');
}
?>

Indice

<code>strlen($mot_de_passe)</code> <div> La chaîne de caractères dont on veut connaître la longueur (exemple : "monmotdepasse123")

INTERMÉDIAIRE

Objectif : Apprendre à l'utiliser les tableaux en php et récupérer le code

php

<?php
// Validation du rôle (liste blanche)
// POURQUOI ? Empêcher l'injection de rôles non autorisés
// EXEMPLE D'ATTAQUE : Un pirate pourrait modifier le HTML et envoyer role="super_admin"
$roles_autorises = ['admin', 'editor', 'contributor'];
if (!in_array($role, $roles_autorises)) {
    die('Erreur : Rôle non autorisé.');
}
?>

Indice

<code>in_array($role, $roles_autorises)</code> <div> La valeur à rechercher (exemple : "admin", "pirate", "super_admin")

INTERMÉDIAIRE

Objectif : Apprendre à l'utiliser, sécuriser votre champs téléphone et récupérer le code

php

<?php
// Validation du téléphone (si fourni)
// POURQUOI ? S'assurer que le format est correct pour éviter les erreurs
if (!empty($phone) && !preg_match('/^[0-9+\-\s\(\)]{8,20}$/', $phone)) {
    die('Erreur : Format de téléphone invalide.');
}
?>

Indice

<code>preg_match('/^[0-9+\-\s\(\)]{8,20}$/', $phone)</code> <div> Vérifie si une chaîne correspond exactement à un motif (pattern) défini par une expression régulière

INTERMÉDIAIRE

Objectif : Apprendre à se protéger. Utiliser et récupérer le code

php

<?php
// Validation du form_id (protection CSRF basique)
// POURQUOI ? Vérifier que la requête vient bien de notre formulaire
// SANS ÇA ? Des sites malveillants pourraient envoyer des données à notre formulaire
// registration_form_aleatoire est a remplacer par le token stocké en session $_SESSION['csrf_token']
if ($csrf !== 'registration_form_aleatoire') {
    die('Erreur : CSRF token invalide.');
}
?>

Indice

<code>$_SESSION['csrf_token']</code> <div> Système qui permet de stocker des données temporaires liées à un utilisateur spécifique pendant sa visite sur le site

Un formulaire d’inscription sécurisé

Validation, nettoyage, filter_var, preg_match et jeton CSRF : les briques d’un formulaire qui résiste.