Aller au contenu principal

Validation et filtrage des entrées

Notions théoriques

Pourquoi valider et filtrer les entrées ?

Lorsqu'un utilisateur saisit des données dans un formulaire ou envoie des informations à un programme, ces données ne sont pas forcément fiables. Elles peuvent être incorrectes, malveillantes ou simplement mal formatées.

Ne pas valider et filtrer les entrées peut entraîner :

  • Des erreurs de fonctionnement du programme
  • Des failles de sécurité (injections SQL, XSS, exécution de code malveillant)
  • Des incohérences dans les données stockées

Différence entre validation et filtrage

  • Validation : Vérifie si une donnée respecte un format précis

    Exemple : une adresse e-mail doit contenir @ et un domaine valide.

  • Filtrage : Nettoie la donnée pour supprimer les caractères indésirables ou dangereux

    Exemple : suppression des balises HTML dans un champ texte.

ActionTypeRaison
Vérifier si un email contient @✅ ValidationOn vérifie une règle de format.
Supprimer les espaces avec trim()✅ FiltrageOn nettoie la donnée, sans se soucier de sa validité.
Vérifier qu’un âge est entre 0 et 120✅ ValidationOn vérifie une contrainte logique sur la valeur.
Convertir < en &lt;✅ FiltrageOn protège l’affichage contre des caractères dangereux (XSS).
Exemple d'un filtrage

La suppression des espaces avec trim() est considérée comme une opération de filtrage car :


Définition du filtrage

Filtrer, c’est nettoyer ou transformer une donnée pour la rendre plus sûre ou plus propre avant de la traiter ou de la stocker.


Que fait trim() ?

$email = trim($email);
  • La fonction trim() supprime les espaces blancs (et autres caractères invisibles comme \n, \t) au début et à la fin d'une chaîne.
  • Elle ne vérifie pas si la donnée est correcte, mais elle modifie la donnée pour la rendre plus propre.

Qu'est-ce qu'une entité HTML ?

Une entité HTML est une séquence de caractères utilisée pour représenter des symboles ou caractères spéciaux dans un document HTML.

Une entité HTML commence par une esperluette (&) et se termine par un point-virgule (;).

Fonctionnalités principales :

  • Afficher des caractères réservés : Par exemple, `` sont interprétés comme des balises HTML. Pour les afficher comme texte, on utilise &lt; et &gt;.
  • Intégrer des symboles complexes : Comme les caractères accentués (ex. é pour « é »), des symboles mathématiques (ex. π), ou des icônes (ex. ©).
  • Garantir la compatibilité : Permet d’afficher des caractères hors du jeu de caractères déclaré (ex. UTF-8).

Types d’entités :

  • Nommées : Utilisent un identifiant textuel (ex. &eacute; pour « é »).
  • Numériques : Utilisent un code Unicode décimal (&#233;) ou hexadécimal (&#xE9;).

Exemples courants :

  • &nbsp; : Espace insécable.
  • &amp; : Esperluette (&).
  • &copy; : Symbole de copyright (©).

Les entités sont essentielles pour éviter les conflits de syntaxe et enrichir les contenus avec des caractères non accessibles au clavier.

Techniques de validation des entrées

  1. Validation côté client (JavaScript) :

    • Rapide, mais contournable par un utilisateur malveillant
    • Utile pour améliorer l'expérience utilisateur (exemple : vérifier un champ avant soumission)
  2. Validation côté serveur (PHP, Python, etc.) :

    • Obligatoire pour garantir la sécurité
    • Vérifie et filtre les données avant traitement ou stockage

Exemples de validation

  • Vérification de la longueur d’un texte (min et max caractères).
  • Vérification d’un format spécifique (expression régulière pour une adresse e-mail).
  • Vérification d’une valeur numérique (exemple : un âge doit être un nombre entre 0 et 120).

Exemples de filtrage

  • Suppression des espaces inutiles (trim() en PHP).
  • Échappement des caractères spéciaux (htmlspecialchars() pour éviter les attaques XSS).
  • Filtrage des entrées pour éviter les injections SQL (mysqli_real_escape_string()).

Exemple pratique

Il est possible de valider et filtrer une adresse e-mail en PHP avant de l’enregistrer dans une base de données.

Code PHP pour valider et filtrer une adresse e-mail

<?php
function verifier_email($email) {
// Supprimer les espaces inutiles
$email = trim($email);

// Vérifier si l'adresse est bien formée
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return "Adresse e-mail invalide.";
}

// Échapper les caractères spéciaux pour éviter les injections SQL
$email_securise = htmlspecialchars($email, ENT_QUOTES, 'UTF-8');

return "Adresse valide et sécurisée : " . $email_securise;
}

// Exemple d'utilisation

$utilisateur_email = " <script>alert('XSS')</script>test@example.com ";
echo verifier_email($utilisateur_email);
?>

Explication du code

  1. trim($email) : Supprime les espaces en début et fin de chaîne.
  2. filter_var($email, FILTER_VALIDATE_EMAIL) : Vérifie si l’adresse e-mail est valide.
  3. htmlspecialchars($email, ENT_QUOTES, 'UTF-8') : Convertit les caractères spéciaux pour éviter les attaques XSS.
  4. Retourne l’e-mail sécurisé si valide, sinon affiche une erreur.

Test de mémorisation/compréhension


Pourquoi faut-il toujours valider les entrées côté serveur ?


Quelle fonction PHP permet de vérifier si une adresse e-mail est valide ?


Quelle est la différence entre validation et filtrage ?


Quelle fonction PHP permet d’éviter les attaques XSS ?


Quel problème peut causer une injection SQL ?



TP pour réfléchir et résoudre des problèmes

Objectif du TP

Ce TP consiste à créer un formulaire HTML permettant à un utilisateur de saisir son adresse e-mail.

L’entrée sera ensuite traitée par un script PHP qui effectuera les étapes suivantes :

  1. Récupérer l’e-mail soumis par l’utilisateur.
  2. Valider que l’e-mail est bien formé.
  3. Filtrer l’e-mail pour éviter les injections XSS.
  4. Enregistrer l’e-mail validé et sécurisé dans un fichier.
  5. Afficher un message de confirmation ou une erreur en fonction de l’entrée.

Étape 1 : Créer un formulaire HTML

Un formulaire est nécessaire pour permettre à l’utilisateur de saisir son e-mail.

  1. Créer un fichier index.html.
  2. Ajouter un formulaire avec :
    • Un champ texte pour l’adresse e-mail.
    • Un bouton pour envoyer le formulaire.
    • Une méthode POST pour transmettre les données de manière sécurisée.

Code du formulaire HTML :

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Validation d'e-mail</title>
</head>
<body>
<h2>Inscription</h2>
<form action="process.php" method="POST">
<label for="email">Adresse e-mail :</label>
<input type="text" id="email" name="email" required>
<button type="submit">Envoyer</button>
</form>
</body>
</html>
Une solution

Étape 2 : Récupérer et valider l'e-mail en PHP

Le formulaire envoie les données à process.php, qui doit récupérer et valider l’e-mail.

  1. Créer un fichier process.php.
  2. Vérifier que la requête est bien envoyée via POST.
  3. Récupérer l’e-mail soumis et supprimer les espaces inutiles.
  4. Vérifier si l’e-mail est valide avec filter_var().
  5. Afficher un message d’erreur si l’e-mail est invalide.

Code PHP pour récupérer et valider l’e-mail :

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$email = trim($_POST["email"]);

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
die("Erreur : Adresse e-mail invalide.");
}

echo "Adresse e-mail valide.";
}
?>
Une solution

Étape 3 : Sécuriser l’e-mail contre les attaques XSS

Une fois l’e-mail validé, il faut le sécuriser pour éviter les attaques XSS.

  1. Convertir les caractères spéciaux en entités HTML avec htmlspecialchars().
  2. Afficher l’e-mail sécurisé pour vérifier qu’il ne contient pas de code malveillant.

Code PHP pour sécuriser l’e-mail :

$email_securise = htmlspecialchars($email, ENT_QUOTES, 'UTF-8');
echo "Adresse e-mail sécurisée : " . $email_securise;
Une solution

Étape 4 : Enregistrer l’e-mail validé dans un fichier

L’e-mail validé et sécurisé doit être stocké dans un fichier emails.txt.

  1. Ouvrir le fichier emails.txt en mode ajout (a).
  2. Écrire l’e-mail sécurisé dans le fichier.
  3. Ajouter un saut de ligne après chaque e-mail.
  4. Afficher un message confirmant l’enregistrement.

Code PHP pour enregistrer l’e-mail :

$file = fopen("emails.txt", "a");
fwrite($file, $email_securise . PHP_EOL);
fclose($file);

echo "Adresse e-mail enregistrée avec succès.";
Une solution

Étape 5 : Vérifier le fichier de stockage

  1. Ouvrir le fichier emails.txt avec un éditeur de texte.
  2. Vérifier que les e-mails enregistrés sont bien formatés et sécurisés.
  3. Tester avec plusieurs e-mails valides et invalides pour observer le comportement du script.
Une solution

Étape 6 : Tester le script avec différents scénarios

  1. Saisir une adresse e-mail correcte (exemple@test.com).
    • Résultat attendu : "Adresse e-mail enregistrée avec succès."
  2. Saisir une adresse e-mail incorrecte (exemple@.com).
    • Résultat attendu : "Erreur : Adresse e-mail invalide."
  3. Saisir une tentative d’injection XSS (<script>alert('XSS')</script>@test.com).
    • Résultat attendu : L’e-mail est sécurisé et affiché sans exécuter le script.
Une solution