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 120ValidationOn 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