17.11.2 Encodage pour format HTML et XML

17.11.2.1 Introduction

Lors de la génération d'une page HTML ou XML contenant des données externes, il est important d'encoder correctement les données externes de tel manière que celles-ci ne soient pas considérée comme une partie du XML ou du HTML mais bien comme du texte.

Le moteur de template de Dynacase met à disposition deux méthodes permettant d'encoder du texte : Layout::eSet(), Layout::eSetBlockData().

Ces méthodes permettent d'encoder les chaînes de caractères intégrées dans un template pour que celles-ci ne soient pas considérées comme du XML valide mais comme du texte.

On peut donc les considérer comme une protection contre les failles de types XSS.

17.11.2.2 Avertissements

Les méthodes Layout::eSet(), Layout::eSetBlockData() ne doivent être utilisées que dans le cas d'affectation d'une variable dont on sait que le contenu est du texte. Si le contenu attendu est du HTML ou XML, il faut utiliser set.

Dans le cas de la production de XML, il faut penser à ajouter les entités nécessaires.

De plus, les & dans les URL doivent être encodés en &

17.11.2.3 Exemple

Soit une action permettant de montrer à un utilisateur le titre de son animal préféré, le code est le suivant :

Code PHP :

require_once "FDL/freedom_util.php";
 
function zoo_favorite(Action & $action)
{
 
    $doc = new_Doc("", "FAVORITE");
    $action->lay->set("TITRE", $doc->getTitle());
 
}

Layout :

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    Bonjour !
 
    Ceci est le titre de votre document animal préféré : <strong>[TITRE]</strong>.
</body>
</html>

Si le nom du document animal favoris est Clovis.

La page suivante est obtenue :

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    Bonjour !
 
    Ceci est le titre de votre document animal préféré : <strong>Clovis</strong>.
</body>
</html>

Maintenant, si le nom est : <a>Mon Préféré

La page suivante est obtenue :

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    Bonjour !
 
    Ceci est le titre de votre document animal préféré : <strong><a>Mon Préféré</strong>.
</body>
</html>

Ce qui donne :

Html mal encodé

Figure 117. Html mal encodé

Cette page a deux défauts :

  • lorsqu'elle est rendu, on ne voit plus le <a> car il a été interprété comme du HTML,
  • ce n'est pas du HTML valide car elle contient une balise <a> mais pas de balise fermante </a>.

Nous allons faire évoluer notre code PHP, en utilisant au lieu de Layout::set() la méthode Layout::eSet().

On a donc le PHP suivant :

require_once "FDL/freedom_util.php";
 
function zoo_favorite(Action & $action)
{
 
    $doc = new_Doc("", "FAVORITE");
    $action->lay->eSet("TITRE", $doc->getTitle());
 
}

Et on génère le HTML suivant :

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    Bonjour !
 
    Ceci est le titre de votre document animal préféré : <strong>&lt;a&gt;Mon Préféré</strong>.
</body>
</html>

Ce qui donne :

Html bien encodé

Figure 118. Html bien encodé

La partie <a> a été encodée et apparaît dans le HTML comme &lt;a&gt; et est rendue sous la forme suivante <a>.

×
mis à jour