PHP Academy · Leçon

Nettoyer les entrées utilisateur

Supprimer les caractères dangereux avec htmlspecialchars et filter_input.

Leçon 4 sur 413 étapes

Nettoyer les entrées utilisateur est une leçon PHP Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage PHP Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours PHP Academy comprend 4 leçons au total.

Assainissement ou validation ?

La validation vérifie que les données respectent les exigences (et les rejette dans le cas contraire).
L'assainissement nettoie les données en supprimant ou en encodant les caractères dangereux afin de permettre leur utilisation en toute sécurité.

Les deux sont nécessaires : validez d'abord, puis assainissez les données destinées à la sortie.

htmlspecialchars() pour une sortie HTML

Échappez toujours les données de sortie avant de les insérer dans du HTML afin d'empêcher les attaques XSS :

<?php
$name = '<script>alert(1)</script>';

// Dangerous — executes script:
// echo $name;

// Safe:
echo htmlspecialchars($name, ENT_QUOTES | ENT_HTML5, 'UTF-8');
// &lt;script&gt;alert(1)&lt;/script&gt;

htmlentities() ou htmlspecialchars()

Les deux échappent le HTML, mais htmlentities convertit TOUS les caractères concernés, tandis que htmlspecialchars ne convertit que les cinq caractères les plus dangereux :

<?php
$str = '<b>caf&eacute;</b> & "bar"';

// htmlspecialchars: only & < > ' "
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8');

// htmlentities: also converts é → &eacute;
echo htmlentities($str, ENT_QUOTES, 'UTF-8');
// Prefer htmlspecialchars — htmlentities can break UTF-8

filter_var FILTER_SANITIZE_*

Les modes d'assainissement de filter_var suppriment le contenu dangereux :

<?php
$rawEmail = 'user(bad)@exam<ple.com';
$clean = filter_var($rawEmail, FILTER_SANITIZE_EMAIL);
echo $clean; // user@example.com

$rawUrl = 'http://exa mple.com/pa th?q=foo bar';
$cleanUrl = filter_var($rawUrl, FILTER_SANITIZE_URL);
echo $cleanUrl;

strip_tags()

Supprimez les balises HTML d'une chaîne, en conservant éventuellement les balises autorisées :

<?php
$input = '<p>Hello <b>World</b> <script>alert(1)</script></p>';

// Remove all tags:
echo strip_tags($input);
// Hello World alert(1)

// Keep only <b> and <i>:
echo strip_tags($input, '<b><i>');
// Hello <b>World</b>

Assainissement pour SQL

N'assainissez jamais du SQL avec des fonctions de traitement de chaînes : utilisez toujours des requêtes préparées. Voici la bonne méthode :

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');

// WRONG — even with addslashes this is dangerous:
// $sql = "SELECT * FROM users WHERE email = '" . addslashes($email) . "'";

// CORRECT — prepared statement:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);
$user = $stmt->fetch();

addslashes() ou requêtes préparées

addslashes() échappe les barres obliques inverses et les guillemets, mais ce n'est PAS sûr pour SQL. Utilisez plutôt des requêtes préparées PDO. addslashes() peut néanmoins servir à d'autres fins que SQL, par exemple pour générer des chaînes JavaScript :

<?php
// For embedding PHP string into JavaScript (still escape via json_encode):
$jsData = json_encode(['name' => $userInput], JSON_HEX_QUOT);
echo "<script>var data = $jsData;</script>";

Assainissement des noms de fichiers

Supprimez les caractères dangereux des noms de fichiers téléversés :

<?php
function sanitizeFilename(string $name): string {
    // Remove path traversal chars and other dangerous ones
    $name = basename($name);                          // strip any path
    $name = preg_replace('/[^a-zA-Z0-9._-]/', '_', $name); // only safe chars
    $name = preg_replace('/_{2,}/', '_', $name);      // collapse underscores
    return strtolower($name);
}

echo sanitizeFilename('../../../etc/passwd');   // etc_passwd
echo sanitizeFilename('My Photo (1).JPG');      // my_photo_1_.jpg

Conversion en entier pour les identifiants

La méthode d'assainissement la plus simple pour les identifiants numériques consiste à les convertir en int, ce qui élimine tout contenu non numérique :

<?php
// Never do this:
$id = $_GET['id'];
$sql = "SELECT * FROM posts WHERE id = $id";

// Safe approach 1: cast to int
$id = (int) ($_GET['id'] ?? 0);
if ($id <= 0) die('Invalid ID');

// Safe approach 2: validate
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if (!$id) die('Invalid ID');

Le contexte de sortie est important

Les différents contextes de sortie nécessitent des mécanismes d'échappement différents :

  • Corps HTML → htmlspecialchars()
  • Attribut HTML → htmlspecialchars(ENT_QUOTES)
  • JSON/JavaScript → json_encode()
  • Paramètre d'URL → urlencode()
  • SQL → requêtes préparées

urlencode et rawurlencode

Encodez les valeurs pour les utiliser dans des URL :

<?php
$search = 'hello world & PHP';

echo urlencode($search);
// hello+world+%26+PHP  (+ for spaces)

echo rawurlencode($search);
// hello%20world%20%26%20PHP  (RFC 3986 — use in paths)

$url = 'https://example.com/search?q=' . urlencode($search);
echo $url;

Vérification rapide

Quelle fonction est la bonne méthode pour empêcher une injection SQL lorsque vous utilisez des données saisies par l'utilisateur dans une requête de base de données ?

Récapitulatif : assainissement des données saisies

Règles d'assainissement :

  • Sortie HTML → htmlspecialchars(ENT_QUOTES, 'UTF-8')
  • SQL → requêtes préparées, jamais d'échappement avec des chaînes
  • URL → urlencode() ou rawurlencode()
  • Noms de fichiers → supprimer les caractères avec une expression régulière et utiliser basename()
  • Identifiants entiers → convertir avec (int)
  • Balises → strip_tags() pour filtrer les balises autorisées
Gratuit pour commencer

Apprends PHP avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
49
Leçons
195

Questions Fréquemment Posées

La leçon « Nettoyer les entrées utilisateur » est-elle gratuite ?

Oui — le texte complet de « Nettoyer les entrées utilisateur » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours PHP Academy, passe à CoddyKit PRO. Le cours PHP Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Nettoyer les entrées utilisateur » ?

Supprimer les caractères dangereux avec htmlspecialchars et filter_input. Tu pratiques PHP Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer PHP Academy ?

Aucune expérience préalable n'est requise. PHP Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Nettoyer les entrées utilisateur » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon PHP Academy ?

Oui. Chaque leçon PHP Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. GET ou POST : quand utiliser chacun
  2. Lire les données de formulaire avec les superglobales
  3. Techniques de validation des entrées
  4. Nettoyer les entrées utilisateur
← Retour à PHP Academy