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.

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