La sécurité est un aspect incontournable du développement PHP, pourtant de nombreux débutants confondent encore sanitization et escaping. Ces deux mécanismes jouent pourtant un rôle essentiel pour protéger vos formulaires, vos bases de données et vos utilisateurs contre de nombreuses failles de sécurité.
Dans ce tutoriel, vous allez comprendre simplement à quoi servent la sanitization et l’escaping, quand les utiliser et quelles fonctions PHP privilégier pour manipuler et afficher des données en toute sécurité. Des exemples concrets vous permettront d’adopter rapidement les bons réflexes utilisés dans les applications web modernes.
- Comprendre la différence entre sanitization et escaping pour sécuriser correctement vos applications PHP.
- Découvrir les fonctions PHP essentielles pour nettoyer, valider et afficher les données sans risque.
- Adopter les bonnes pratiques utilisées dans les projets professionnels pour éviter les erreurs de sécurité courantes.
Lorsque l’on débute en PHP, il est fréquent de se concentrer sur le fonctionnement du code, les formulaires ou encore les bases de données. Pourtant, un aspect essentiel est souvent négligé : la sécurité des données.
Imaginez un instant qu’un visiteur saisisse du contenu malveillant dans un formulaire de contact. Si votre site affiche ensuite ce contenu sans précaution, vous pourriez involontairement exécuter du code dangereux dans le navigateur de vos visiteurs. Ce scénario est malheureusement très courant.
C’est précisément pour éviter ce type de problème que les notions de sanitization et d’escaping existent.
Pourquoi faut-il sécuriser les données ?
Un site web échange constamment des informations avec ses utilisateurs.
Chaque formulaire, chaque champ de recherche, chaque commentaire ou chaque message envoyé représente une porte d’entrée potentielle pour des données imprévues.
Prenons un exemple très simple :
<?php
echo $_POST['nom'];
?>
Si l’utilisateur saisit :
<script>alert('Bonjour')</script>
- Le navigateur exécutera ce script au lieu de l’afficher comme un simple texte.
Ce type d’attaque est appelé XSS (Cross-Site Scripting). Pour en savoir plus pour détecter les faille XSS d’un site web, consultez nos tutoriels complet sur DalFox ou Owasp Zap.
L’objectif des mécanismes de sanitization et d’escaping est justement d’empêcher ce genre de comportement.
Pour bien comprendre leur rôle, il faut commencer par distinguer ces deux notions.
Sanitization et escaping : quelle différence ?
De nombreux débutants pensent que ces termes désignent exactement la même chose.
En réalité, ils répondent à deux besoins différents.
La sanitization : nettoyer les données
La sanitization consiste à nettoyer une donnée avant de l’utiliser.
On retire ou on modifie les caractères indésirables afin d’obtenir une valeur conforme à ce que l’on attend.

Par exemple :
- supprimer des balises HTML ;
- retirer des caractères spéciaux ;
- ne conserver que des chiffres ;
- nettoyer une adresse e-mail.
L’objectif est de rendre la donnée plus propre et plus prévisible.
L’escaping : sécuriser l’affichage
L’escaping intervient généralement au moment où l’on affiche une donnée.
On transforme certains caractères spéciaux afin qu’ils soient interprétés comme du texte et non comme du code.
Par exemple :
<script>alert('test')</script>
devient :
<script>alert('test')</script>
Le navigateur affiche alors le texte au lieu d’exécuter le script.

En résumé :
- Sanitization = nettoyer une donnée.
- Escaping = sécuriser son affichage.
Ces deux techniques sont complémentaires.
Comprendre le cycle de vie d’une donnée
Pour savoir quand appliquer chaque méthode, il est utile de suivre le parcours d’une donnée. Imaginons un formulaire d’inscription.
L’utilisateur saisit :
Jean <script>alert('hack')</script>
Le cycle idéal est le suivant :
- Réception de la donnée.
- Validation du format attendu.
- Sanitization si nécessaire.
- Enregistrement en base de données.
- Récupération de la donnée.
- Escaping avant affichage.
Cette approche permet de conserver des données cohérentes tout en protégeant l’application.
Gardez en tête que l’attribut pattern pour un formulaire HTML ne suffit pas pour la sécurité, il améliore uniquement l’UX. S’en est de même pour la validation des données d’un formulaire en JS, cela améliore le confort de l’utilisateur mais ce n’est pas gage de sécurité.
Nettoyer les données avec la sanitization
Voyons maintenant plusieurs méthodes couramment utilisées en PHP.
Supprimer les espaces inutiles avec trim()
Une erreur fréquente consiste à oublier les espaces placés avant ou après une saisie.
PHP propose la fonction trim().
<?php
$nom = " Alban ";
$nom = trim($nom);
echo $nom;
Résultat :
Alban
Cette fonction est extrêmement utile pour nettoyer les champs de formulaire.
Supprimer les balises HTML avec strip_tags()
Si vous souhaitez empêcher l’utilisation du HTML, vous pouvez utiliser strip_tags().
<?php
$message = "<h1>Bonjour</h1>";
$message = strip_tags($message);
echo $message;
Résultat :
Bonjour
Toutes les balises HTML sont supprimées.
Cette fonction est particulièrement utile pour les champs comme :
- un nom
- un prénom
- une ville
- un numéro de téléphone
👉 Pour allez plus loin, apprenez à sécuriser une variable PHP.
Nettoyer une adresse e-mail
PHP dispose d’un filtre intégré.
<?php
$email = " contact@example.com ";
$email = filter_var(
$email,
FILTER_SANITIZE_EMAIL
);
echo $email;
Le résultat sera une adresse propre et exploitable.
Nettoyer une URL
<?php
$url = filter_var(
$_POST['site'],
FILTER_SANITIZE_URL
);
Cela permet d’éliminer certains caractères non désirés.
👉 Extension URI depuis PHP 8.5 pour avoir enfin des URL propres
Nettoyer un nombre entier
<?php
$age = filter_var(
$_POST['age'],
FILTER_SANITIZE_NUMBER_INT
);
Si l’utilisateur saisit :
25 ans
PHP conservera uniquement :
25
Très pratique lorsque vous attendez exclusivement des chiffres.
La validation : l’étape souvent oubliée
Beaucoup de développeurs pensent qu’il suffit de nettoyer les données. Ce n’est pas toujours le cas car une donnée propre n’est pas forcément valide.
Prenons un exemple.
<?php
$email = filter_var(
$_POST['email'],
FILTER_SANITIZE_EMAIL
);
L’adresse obtenue peut être propre mais invalide :
test@
C’est pourquoi il faut également valider.
<?php
$email = filter_var(
$_POST['email'],
FILTER_SANITIZE_EMAIL
);
if (
filter_var(
$email,
FILTER_VALIDATE_EMAIL
)
) {
echo "Adresse valide";
} else {
echo "Adresse invalide";
}
La règle est simple :
- Sanitization = nettoyage.
- Validation = vérification.
Ce sont deux étapes différentes.
👉 Apprenez à valider un champ input mail en PHP/JS, une adresse mail en PHP ou utiliser une RegEx mail.
L’escaping : protéger l’affichage
Passons maintenant au deuxième pilier de la sécurité.
Des formations informatique pour tous !
Débutant ou curieux ? Apprenez le développement web, le référencement, le webmarketing, la bureautique, à maîtriser vos appareils Apple et bien plus encore…
Formateur indépendant, professionnel du web depuis 2006, je vous accompagne pas à pas et en cours particulier, que vous soyez débutant ou que vous souhaitiez progresser. En visio, à votre rythme, et toujours avec pédagogie.
Découvrez mes formations Qui suis-je ?Même si une donnée semble correcte, il est dangereux de l’afficher directement.
Le problème
Supposons que votre base de données contienne :
<script>alert('XSS')</script>
Si vous affichez la valeur telle quelle :
<?php
echo $message;
Le script s’exécutera.
La solution : htmlspecialchars()
La fonction la plus utilisée en PHP est htmlspecialchars().
<?php
echo htmlspecialchars($message);
Le navigateur affichera :
<script>alert('XSS')</script>
comme du texte.
- Le script ne sera jamais exécuté.
Comprendre ce que fait htmlspecialchars()
Cette fonction transforme notamment :
<
>
"
'
&
en leurs équivalents HTML.
Par exemple :
<
devient :
<
Le navigateur ne voit alors plus une balise HTML.
Il voit simplement du texte.
Utiliser les bons paramètres
Dans un projet moderne, on utilise généralement :
<?php
echo htmlspecialchars(
$message,
ENT_QUOTES,
'UTF-8'
);
Voyons ce que cela signifie :
- ENT_QUOTES : Cette option convertit également les apostrophes et les guillemets.
- UTF-8 : Elle garantit une gestion correcte des caractères accentués.
C’est aujourd’hui la norme sur le web.
Exemple concret avec un formulaire
Imaginons un formulaire permettant de publier un commentaire.
Formulaire HTML
<form method="post">
<input type="text" name="pseudo">
<textarea name="message"></textarea>
<button>Envoyer</button>
</form>
Traitement PHP
<?php
$pseudo = trim($_POST['pseudo']);
$message = trim($_POST['message']);
$pseudo = strip_tags($pseudo);
Affichage sécurisé
<?php
echo "<h2>";
echo htmlspecialchars(
$pseudo,
ENT_QUOTES,
'UTF-8'
);
echo "</h2>";
echo "<p>";
echo htmlspecialchars(
$message,
ENT_QUOTES,
'UTF-8'
);
echo "</p>";
Même si un utilisateur tente d’injecter du code JavaScript, celui-ci sera affiché sous forme de texte.
Une erreur fréquente chez les débutants
Il arrive souvent de voir ceci :
<?php
$message = htmlspecialchars(
$_POST['message']
);
puis :
<?php
echo $message;
Cela fonctionne dans certains cas, mais ce n’est pas la meilleure approche.
Pourquoi ? Parce que vous modifiez la donnée dès son arrivée.
Si plus tard vous souhaitez :
- l’envoyer dans un e-mail ;
- la convertir en PDF ;
- l’afficher dans une API ;
- l’utiliser dans un autre contexte ;
vous risquez d’obtenir un résultat incorrect.
La bonne pratique consiste à conserver la donnée originale puis à effectuer l’escaping uniquement au moment de l’affichage.
Autrement dit :
Base de données
↓
Donnée originale
↓
Affichage
↓
htmlspecialchars()
Cette approche offre beaucoup plus de flexibilité.
👉 Pour aller plus loin avec les formulaires, découvrez comment coder un formulaire sécurisé de login en PHP.
L’escaping dépend du contexte
Un point souvent méconnu est que l’escaping varie selon l’endroit où la donnée sera utilisée.
Affichage HTML
htmlspecialchars()
URL
urlencode()
Exemple :
<?php
$recherche = "cours PHP";
$url = "resultat.php?q="
. urlencode($recherche);
JavaScript
Lorsque vous injectez des données dans du JavaScript, il faut utiliser des techniques adaptées.
Par exemple :
<?php
$nom = "Alban";
?>
<script>
let nom =
<?= json_encode($nom); ?>;
</script>
L’utilisation de json_encode() permet d’éviter de nombreux problèmes de sécurité.
Sanitization et base de données
Une confusion très répandue consiste à croire que la sanitization protège automatiquement contre les injections SQL.
Ce n’est pas vrai.
Pour sécuriser une requête SQL, il faut utiliser des requêtes préparées.
Exemple avec PDO :
<?php
$sql = "
SELECT *
FROM utilisateurs
WHERE email = ?
";
$stmt = $pdo->prepare($sql);
$stmt->execute([
$email
]);
Grâce aux requêtes préparées, PHP sépare les données du code SQL.
C’est aujourd’hui la méthode recommandée.
Les bonnes pratiques
Voici un exemple simple regroupant plusieurs notions vues dans ce tutoriel.
<?php
$pseudo = trim($_POST['pseudo']);
$email = trim($_POST['email']);
$pseudo = strip_tags($pseudo);
$email = filter_var(
$email,
FILTER_SANITIZE_EMAIL
);
if (
!filter_var(
$email,
FILTER_VALIDATE_EMAIL
)
) {
die(
"Adresse invalide"
);
}
$stmt = $pdo->prepare(
"
INSERT INTO utilisateurs
(
pseudo,
email
)
VALUES
(
?,
?
)
"
);
$stmt->execute([
$pseudo,
$email
]);
echo htmlspecialchars(
$pseudo,
ENT_QUOTES,
'UTF-8'
);
Dans cet exemple :
- les espaces sont supprimés ;
- les balises HTML sont retirées ;
- l’adresse e-mail est nettoyée ;
- l’adresse e-mail est validée ;
- l’insertion SQL utilise une requête préparée ;
- l’affichage est sécurisé avec un escaping adapté.
C’est exactement le type de logique que vous retrouverez dans les applications professionnelles.
Les bonnes habitudes à adopter
Avec l’expérience, certains réflexes deviennent automatiques.
- Lorsque vous récupérez une donnée utilisateur, demandez-vous toujours : « Quel type de donnée est attendu ? »
- Lorsque vous l’enregistrez : « Dois-je la nettoyer ou la valider ? »
- Lorsque vous l’affichez : « Dans quel contexte va-t-elle être utilisée ? »
Cette simple série de questions permet déjà d’éviter une grande partie des erreurs de sécurité les plus courantes.
La sécurité web n’est pas une fonctionnalité que l’on ajoute à la fin d’un projet. Elle fait partie du développement dès la première ligne de code.
Quelle est la différence entre sanitization et escaping en PHP ?
La sanitization sert à nettoyer une donnée reçue afin de supprimer ou modifier les caractères indésirables. L’escaping, quant à lui, consiste à sécuriser une donnée avant son affichage pour éviter qu’elle soit interprétée comme du code HTML ou JavaScript.
Faut-il utiliser htmlspecialchars() sur toutes les données affichées ?
Dans la majorité des cas, oui. Dès qu’une donnée provient d’un utilisateur ou d’une source externe et qu’elle est affichée dans une page HTML, l’utilisation de htmlspecialchars() est une bonne pratique pour se protéger contre les attaques XSS.
La sanitization protège-t-elle contre les injections SQL ?
Non. Nettoyer une donnée ne suffit pas pour sécuriser une requête SQL. Pour éviter les injections SQL, il est recommandé d’utiliser des requêtes préparées avec PDO ou MySQLi, qui séparent les données du code SQL.
Les notions de sanitization et d’escaping sont parmi les fondations les plus importantes du développement PHP moderne. Elles peuvent sembler abstraites lors des premiers apprentissages, mais elles deviennent rapidement indispensables dès que votre application interagit avec de vrais utilisateurs.
Retenez surtout que la sanitization sert à nettoyer les données tandis que l’escaping sert à sécuriser leur affichage. Ces deux mécanismes ne s’opposent pas : ils travaillent ensemble pour protéger votre application.
La meilleure façon de progresser consiste maintenant à pratiquer. Prenez un ancien formulaire de votre site, analysez chaque champ et demandez-vous quelles validations, quels nettoyages et quels mécanismes d’affichage sécurisé pourraient être mis en place. Vous découvrirez rapidement que la sécurité n’est pas une contrainte supplémentaire, mais un réflexe qui rend vos projets plus robustes et plus professionnels.
Et si vous développez déjà vos propres applications PHP, vous venez d’acquérir l’un des réflexes les plus précieux du métier : ne jamais faire confiance aveuglément aux données reçues.
👉 Pour aller plus loin, découvrez 20 Regex essentielles.

Fondateur de l’agence Créa-troyes, affiliée France Num
Intervenant en Freelance.
Contactez-moi
