Encoder HTML en PHP

Habdul Hazeez 30 janvier 2023
  1. Encoder avec htmlspecialchars()
  2. Encoder avec htmlentities()
  3. Encoder avec htmlentities() et encodage HTML5
  4. Encoder avec une méthode personnalisée
Encoder HTML en PHP

L’encodage HTML est une tentative d’empêcher cross-site scripting XSS dans les applications Web PHP lors du traitement des données fournies par l’utilisateur. Ce didacticiel vous apprendra à encoder des données avec htmlentities(), htmlspecialchars() et une méthode personnalisée.

Encoder avec htmlspecialchars()

PHP htmlspecialchars() est une fonction intégrée capable de convertir des caractères spéciaux en entités HTML. La syntaxe est la suivante :

htmlspecialchars( $string, $flags, $encoding, $double_encode )

Explication des paramètres :

  • $string : La chaîne d’entrée
  • $flags : les drapeaux qui dictent comment la fonction doit gérer les guillemets dans la chaîne
  • $encoding : spécifie l’encodage utilisé par la fonction. Ce paramètre est facultatif
  • $double_encode : un attribut booléen qui dicte si PHP encodera les entités existantes. Si vous le définissez sur false, PHP n’encodera pas les entités existantes

Comme toutes les fonctions, htmlspecialchars() renvoie une valeur. Sa valeur est la chaîne convertie. Mais, si la fonction considère la chaîne comme invalide, elle renverra une chaîne vide.

L’exemple suivant montre comment convertir une chaîne avec htmlspecialchars(). Vous remarquerez que la fonction n’est utilisée avec aucun drapeau.

<?php
    $stringToEncode = "A <b>bold text</b> a'nd á <script>alert();</script> tag";

    $encodedString = htmlspecialchars($stringToEncode);

    echo $encodedString;
?>

Production :

A <b>bold text</b> a'nd á <script>alert();</script> tag

Lorsque vous consultez le source de la page Web, vous constatez que l’apostrophe et les caractères á ne sont pas encodés :

A &lt;b&gt;bold text&lt;/b&gt; a'nd á &lt;script&gt;alert();&lt;/script&gt; tag

Maintenant, si vous fournissez un drapeau et un format d’encodage à htmlspecialchars(), l’apostrophe est encodée, mais pas le á.

<?php
    $stringToEncode = "A <b>bold text</b> a'nd á <script>alert();</script> tag";

    $encodedString = htmlspecialchars($stringToEncode, ENT_QUOTES, 'UTF-8');
    
    echo $encodedString;
?>

Production :

A <b>bold text</b> a'nd á <script>alert();</script> tag

Afficher la source de la page montre que le navigateur encode l’apostrophe sous la forme &#039; :

A &lt;b&gt;bold text&lt;/b&gt; a&#039;nd á &lt;script&gt;alert();&lt;/script&gt; tag

Encoder avec htmlentities()

Le htmlentites() est également une fonction PHP intégrée. Avec htmlentities(), tous les caractères applicables sont convertis en entités HTML. Sa syntaxe est la suivante :

htmlentities( $string, $flags, $encoding, $double_encode )

Voici une explication des paramètres :

  • $string : La chaîne d’entrée
  • $flags : les drapeaux qui dictent comment la fonction doit gérer les guillemets dans la chaîne
  • $encoding : spécifie l’encodage utilisé par la fonction. Ce paramètre est facultatif
  • $double_encode : un attribut booléen qui dicte si PHP encodera les entités existantes. Si vous le définissez sur false, PHP n’encodera pas les entités existantes

La valeur de retour de cette fonction est la chaîne encodée.

Voici un exemple de conversion d’une chaîne avec htmlentities(). Ici, htmlentities() n’est utilisé avec aucun drapeau.

<?php    
    $stringToEncode = "A <b>bold text</b> ánd a <script>alert();</script> tag's";

    $ecodedString = htmlentities($stringToEncode);

    echo $ecodedString;
?>

Production :

A <b>bold text</b> ánd a <script>alert();</script> tag's

La source de vue de la page montre que la fonction encode le caractère á sans aucun indicateur, mais l’apostrophe n’est pas encodée.

A &lt;b&gt;bold text&lt;/b&gt; &aacute;nd a &lt;script&gt;alert();&lt;/script&gt; tag's

Une modification du code permettra à la fonction d’encoder l’apostrophe.

<?php
    $stringToEncode = "A <b>bold text</b> ánd a <script>alert();</script> tag's";

    $ecodedString = htmlentities($stringToEncode, ENT_QUOTES, 'UTF-8');

    echo $ecodedString;
?>

Production :

A <b>bold text</b> ánd a <script>alert();</script> tag's

Afficher la source de la page :

A &lt;b&gt;bold text&lt;/b&gt; &aacute;nd a &lt;script&gt;alert();&lt;/script&gt; tag&#039;s

Encoder avec htmlentities() et encodage HTML5

Lorsque vous avez des caractères non anglais dans votre chaîne, vous pouvez utiliser le drapeau HTML 5 et l’encodage UTF-8.

Le drapeau HTML5 indique à la fonction de traiter la chaîne comme HTML5, et le drapeau UTF-8 permet à la fonction de comprendre n’importe quel caractère Unicode standard.

Voici un exemple d’utilisation de htmlentities() avec un indicateur HTML5 et un encodage UTF-8 :

<?php
    $stringToEncode = "àéò ©€ ♣♦ ↠ ↔↛ āžšķūņ ↙ ℜ℞ ∀∂∋ rūķīš ○";

    $ecodedString = htmlentities($stringToEncode, ENT_HTML5, 'UTF-8');
    
    echo $ecodedString;
?>

Afficher la source de la page :

&agrave;&eacute;&ograve; &copy;&euro; &clubs;&diamondsuit;
&twoheadrightarrow; &harr;&nrarr; &amacr;&zcaron;&scaron;
&kcedil;&umacr;&ncedil; &swarr; &Rfr;&rx; &forall;&part;&ReverseElement;
r&umacr;&kcedil;&imacr;&scaron; &cir;

Encoder avec une méthode personnalisée

Si vous souhaitez appliquer votre schéma d’encodage, une méthode personnalisée peut s’avérer utile. Cette méthode prendra votre chaîne d’entrée et appliquera une manipulation de chaîne. Au final, vous obtenez une chaîne encodée.

Le code HTML suivant comporte une zone de texte et un seul bouton d’envoi. Le formulaire action pointe vers un fichier qui encodera la chaîne passée dans l’entrée du formulaire.

<main>
    <h1>Enter and HTML code and click the submit button</h1>
    <form action='encodedoutput.php' method='post'>
        <div class="form-row">
            <textarea rows='15' cols='50' name='texttoencode' required></textarea>
        </div>
        <div class="form-row">
            <input type='submit'>
        </div>
    </form>
</main>

Le bloc de code suivant est le code PHP qui effectuera l’encodage. Enregistrez-le sous encodedoutput.php

<?php
    if (isset($_POST['texttoencode']) && !empty($_POST)) {
        // Check for empty text
        if ($_POST['texttoencode'] == "") {
            echo "Invalid text";
            die();
        }

        $inputHTML = bin2hex($_POST['texttoencode']); 
        $spiltHTML = chunk_split($inputHTML, 2 ,"%");
        $HTMLStringLength = strlen($spiltHTML);
        $HTMLSubLength = $HTMLStringLength - 1;
        $HTMLSubString = substr($spiltHTML,'0', $HTMLSubLength);

        $encodedOutput="<script>document.write(unescape('%$HTMLSubString'));</script>";

    } else {
        echo "Not allowed";
        die();
    }
?>

<textarea rows='15' cols='60'>
    <?php
        if ($encodedOutput) {
            echo $encodedOutput;
        } else {
            echo "";
            die();
        }
    ?>
</textarea>

Exemple de sortie pour <script>alert("Hello world");</alert> :

<script>document.write(unescape('%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%22%48%65%6c%6c%6f%20%77%6f%72%6c%64%22%29%3b%3c%2f%61%6c%65%72%74%3e'));</script>
Habdul Hazeez avatar Habdul Hazeez avatar

Habdul Hazeez is a technical writer with amazing research skills. He can connect the dots, and make sense of data that are scattered across different media.

LinkedIn