W3docs

htmlspecialchars()

La fonction htmlspecialchars() convertit les caractères spéciaux en entités HTML correspondantes pour sécuriser l'affichage des données utilisateur.

La fonction htmlspecialchars() convertit les quelques caractères ayant une signification particulière en HTML en leurs entités HTML correspondantes. Son rôle principal est la sécurité : lorsque vous affichez des données fournies par l'utilisateur dans une page web, les passer d'abord par htmlspecialchars() empêche que ces données soient interprétées comme du balisage ou du script — c'est la défense standard contre les attaques de cross-site scripting (XSS).

Cette page couvre la syntaxe de la fonction, chacun de ses paramètres avec des exemples exécutables, les cinq caractères qu'elle affecte, ses différences avec les fonctions apparentées, et comment l'inverser en toute sécurité.

Syntaxe

htmlspecialchars(
    string $string,
    int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401,
    ?string $encoding = null,
    bool $double_encode = true
): string

La fonction prend un paramètre obligatoire, $string — la chaîne à convertir — et trois paramètres optionnels : $flags, $encoding et $double_encode. Elle retourne la chaîne convertie.

Note sur le flag par défaut. Depuis PHP 8.1, la valeur par défaut de $flags est ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, ce qui encode à la fois les guillemets simples et doubles. Dans PHP 8.0 et versions antérieures, la valeur par défaut était ENT_COMPAT, qui laissait les guillemets simples intacts. Si vous supportez d'anciennes versions, passez toujours ENT_QUOTES explicitement pour garantir un comportement prévisible.

Quels caractères sont convertis

Seuls cinq caractères sont affectés. Tout le reste passe sans modification :

CaractèreEntité (avec ENT_QUOTES)
& (esperluette)&
" (guillemet double)"
' (guillemet simple)'
< (inférieur à)&lt;
> (supérieur à)&gt;

Si vous avez également besoin d'encoder les lettres accentuées, les symboles et les autres caractères non-ASCII, utilisez htmlentities() à la place.

Exemple de base

php— editable, runs on the server

Résultat :

Hello &lt;strong&gt;World&lt;/strong&gt;!

Les balises <strong> ont été converties en &lt;strong&gt; et &lt;/strong&gt;. Lorsque cette chaîne est envoyée à un navigateur, elle affiche désormais le texte littéral <strong>World</strong> au lieu de rendre le balisage en gras.

Le paramètre $flags : gestion des guillemets

Le deuxième paramètre, $flags, spécifie comment gérer les guillemets et quel type de document utiliser. Le choix le plus courant est ENT_QUOTES, qui convertit à la fois les guillemets simples (') et doubles ("). Cela est important lorsque vous placez une valeur dans un attribut HTML, car un guillemet non échappé pourrait fermer l'attribut prématurément et en injecter de nouveaux.

php— editable, runs on the server

Résultat :

I&#039;m a paragraph

Le guillemet simple a été converti en &#039;. Les valeurs de flag courantes sont :

  • ENT_QUOTES — convertit à la fois les guillemets doubles et simples (recommandé).
  • ENT_COMPAT — convertit les guillemets doubles, laisse les guillemets simples intacts.
  • ENT_NOQUOTES — laisse les deux types de guillemets non convertis.
  • ENT_SUBSTITUTE — remplace les séquences d'unités de code invalides par &#xFFFD; au lieu de retourner une chaîne vide.

Le paramètre $encoding

Le troisième paramètre, $encoding, indique l'encodage des caractères de la chaîne d'entrée. Il prend par défaut la valeur du paramètre INI default_charset (UTF-8 sur les installations modernes). Le spécifier explicitement évite les surprises si votre entrée est dans un encodage différent.

php— editable, runs on the server

Résultat :

Tom &amp; Jerry

Ici l'esperluette est encodée en &amp; tandis que PHP interprète l'entrée comme UTF-8. Si l'encodage ne correspond pas aux octets réels de $string, la fonction peut retourner une chaîne vide (ou un caractère de substitution lorsque ENT_SUBSTITUTE est défini).

Le paramètre $double_encode

Le quatrième paramètre, $double_encode, contrôle si les entités existantes sont encodées à nouveau. Par défaut, il vaut true, donc une chaîne contenant déjà &lt; devient &amp;lt;. Définissez-le à false pour laisser les entités déjà encodées intactes — utile lorsque l'entrée a déjà été partiellement échappée.

php— editable, runs on the server

Résultat :

Hello &lt;strong&gt;World&lt;/strong&gt;!

Les entités &lt; et &gt; existantes sont laissées inchangées car $double_encode vaut false. Avec la valeur par défaut true, la même entrée aurait produit Hello &amp;lt;strong&amp;gt;....

Prévenir les XSS en pratique

L'utilisation la plus importante de htmlspecialchars() est l'échappement de toutes les données que vous ne contrôlez pas entièrement — saisie de formulaire, valeurs de chaîne de requête, enregistrements de base de données provenant d'utilisateurs — avant de les afficher dans une page :

<?php
$comment = $_GET['comment'] ?? '';   // e.g. "<script>alert('xss')</script>"
echo "<p>" . htmlspecialchars($comment, ENT_QUOTES, "UTF-8") . "</p>";
?>

La balise <script> est neutralisée en &lt;script&gt;...&lt;/script&gt;, de sorte que le navigateur affiche le texte au lieu de l'exécuter. Appliquez l'échappement au moment de l'affichage, et non lors du stockage des données, afin que la valeur brute reste disponible pour d'autres contextes.

Inverser la conversion

Pour reconvertir les entités en leurs caractères d'origine, utilisez htmlspecialchars_decode(). Passez les mêmes flags que vous avez utilisés lors de l'encodage afin que les guillemets soient traités de manière symétrique.

Fonctions associées

  • htmlentities() — comme htmlspecialchars() mais convertit tous les caractères ayant des équivalents en entités HTML, pas seulement les cinq caractères spéciaux.
  • htmlspecialchars_decode() — l'inverse de cette fonction.
  • strip_tags() — supprime entièrement les balises HTML et PHP au lieu de les échapper.
  • nl2br() — insère <br> avant les sauts de ligne, souvent utilisé après l'échappement du texte brut.

Résumé

Utilisez htmlspecialchars() chaque fois que vous affichez du texte non fiable dans du HTML. Passez ENT_QUOTES et un encodage UTF-8 explicite pour des résultats prévisibles et sécurisés sur toutes les versions de PHP, échappez au moment de l'affichage, et recourez à htmlentities() uniquement lorsque vous avez besoin d'encoder toutes les entités plutôt que les cinq caractères spéciaux.

Pratique

Pratique
Quelle est la tâche principale de la fonction htmlspecialchars() en PHP ?
Quelle est la tâche principale de la fonction htmlspecialchars() en PHP ?
Was this page helpful?