Nous travaillons dans plusieurs "univers" différents :

- client : un navigateur qui ne parle que HTML
- serveur : PHP qui effectue des traitements
- base de données : des informations accessibles avec SQL.
- url : des adresses sur le réseau

Les chaînes de caractères doivent souvent être codées ou décodées pour satisfaire aux exigences des différents langages en ce qui concerne la syntaxe et les caractères réservés.
Par exemple, les signes > et < doivent être &gt; et &lt; dans HTML pour être interprété correctement. Un espace dans une adresse URL soit être codé %20. Les guillemets simples, les guillemets double et les backslashes doivent être protégés dans une requêtes SQL.
PHP propose donc des fonctions pour nous permettre de travailler facilement avec les chaînes de caractères dans des environnement spécifiques.

### Caractères spéciaux dans HTML

Quand vous envoyez une chaîne au navigateur pour qu'il en fasse l'affichage (nous parlons ici d'une chaîne simple qui ne contient pas intentionnellement des tags HTML), il faut encoder les caractères spéciaux du langage HTML (<, >, &, ...) pour qu'ils ne soient pas interprétés comme éléments du langage, mais traités comme des éléments de texte.

La fonction htmlspecialchars() remplace le minimum de caractères spéciaux d'une chaîne par leur entité HTML :

- & devient &amp;
- < devient $lt;
- > devient &gt;
- " devient &quot;

La fonction htmlentities() remplace aussi ces caractères, mais également tous les caractères accentués.

Le premier paramètre à passer à ces 2 fonctions est la chaîne de caractères à modifier.

Viennent ensuite 2 paramètres à positionner surtout si la chaîne n'est pas composée de caractères en ISO-8859-1 (les caractères des alphabets occidentaux - cf français).
Par exemple, si les chaînes que vous voulez afficher sont encodées en UTF-8, il faut utiliser :

    htmlspecialchars($chaine, ENT_QUOTES, 'UTF-8');
    htmlentities($chaine, ENT_QUOTES, 'UTF-8');

Exemple : codage HTML
<?php require('bib_fonctions.php'); htmlDebut('Codage HTML'); echo 'Affichez le code source de la page pour voir les tranformations effectuées par PHP.'; $x = '< > & " é è à ç ù'; echo "\n<p>Avec htmlspecialchars \n", htmlspecialchars($x, ENT_QUOTES, 'iso-8859-1'); echo "\n<p>Avec htmlentities \n", htmlentities($x, ENT_QUOTES, 'iso-8859-1'); htmlFin(); ?>

### Enlever les tags HTML

La fonction strip_tags() permet d'enlever les tags HTML contenus dans une chaîne. Cette fonction peut être utilisée pour protéger vos sites si vous permettez par exemple que les utilisateurs saisissent des commentaires. Un utilisateur pourrait saisir des tags HTML dans ses commentaires (en particulier un tag <script> et du code JavaScript) qui seraient ensuite interprétés quand d'autres utilisateurs liraient les commentaires.

L'exemple suivant montre un texte contenant un tel type de code, et ensuite affiché dans la page

Exemple : supprimer les tags HTML
<?php require('bib_fonctions.php'); htmlDebut('Supprimer les tags HTML'); $x = 'Texte saisi par un internaute avec une redirection automatique sur un site prirate <script> location="http://univ-fcomte.fr"</script>'; echo $x; htmlFin(); ?>

L'utilisation de strip_tags() permet d'éviter cette redirection (qui est un amusement par rapport à ce qui peut être fait).

Exemple : supprimer les tags HTML
<?php require('bib_fonctions.php'); htmlDebut('Supprimer les tags HTML'); $x = 'Texte saisi par un internaute avec une redirection automatique sur un site prirate <script> location="http://univ-fcomte.fr"</script>'; echo strip_tags($x); htmlFin(); ?>

### Meta tags

La fonction get_meta_tags() renvoie un tableau contenant les tags meta d'une page HTML. Cette fonction peut être utilisée par exemple pour indexer un site, ou donner des informations sur des pages HTML.

Soit la page HTML suivante (test_meta.html dans le dossier "test") :

    <!DOCTYPE html>
    <html lang="fr">
    	<head>
    		<title>Page de test</title>
    		<meta name="keywords" content="test, php, fonction">
    		<meta name="description"
    			content="Page de test de la fonction get_meta_tags">
    		<meta name="author" content="François Piat">
    	</head>
    	<body>
    		Page de test pour la récupération des meta-tags
    	</body>
    </html>

La fonction get_meta_tags() renverra le tableau suivant :

Exemple : meta-tags
<?php require('bib_fonctions.php'); htmlDebut('meta-tags'); $t = get_meta_tags('test_meta.html'); echo '<pre>'; print_r($t); echo '</pre>'; htmlFin(); ?>

### Les caractères dans SQL

La plupart des bases de données demandent que dans les données qui leurs sont envoyées, les guillemets doubles ou simples, et les backslashes soient protégés par un backslash.

Par exemple, pour mettre le texte "C'est un texte "à problème"" dans un INSERT, nous emploierons la syntaxe suivante :

    INSERT INTO latable (leChamp)
           VALUES ('C\'est un texte \"à problème\"')

PHP fournit la fonction addslashes() pour effectuer le travail à notre place.
Pour enlever les backslashes de protection, nous pouvons utiliser la fonction stripslashes()

Exemple : protéger les guillemets
<?php require('bib_fonctions.php'); htmlDebut('Protéger les guillemets'); $nom = "Scarlett O'Hara"; $texte = 'est un nom "à problème"'; echo "<h4>Textes de test</h4> $nom $texte"; echo '<h4>Ajout de backslashes</h4>'; $nom = addslashes($nom); $texte = addslashes($texte); echo "$nom $texte"; echo '<h4>Suppression de backslashes</h4>'; $nom = stripslashes($nom); $texte = stripslashes($texte); echo "$nom $texte"; htmlFin(); ?>

Nous verrons plus en détail dans le chapitre consacré à MySQL comment rendre ses protections plus efficaces, en particulier avec l'utilisation de la fonction dédiée mysqli_real_escape_string.