Protection d’une chaîne en PHP
Certains caractères sont interprétés pas PHP et ont une signification particulière, comme les apostrophes qui délimitent une chaîne. Il est important donc de protéger ces caractères, afin d’éviter de les utiliser comme des commandes au lieu d’être pris tels quels. L’oubli de protection peut être la base de problèmes de sécurité comme l’injection SQL ou le Cross Site Scripting
Protéger les guillemets et les apostrophes
Si vous avez besoin de protéger automatiquement les guillemets, les apostrophes et la barre oblique utilisée pour l’échappement en PHP, utilisez la fonction addslashes(). Cette fonction est utile pour éviter les injections SQL
<textarea>
<?php
$cc = "Hello ' \n PHP!";
echo addslashes($cc);
?>
</textarea>
Affichage
Vous remarquez que l’apostrophes a été échappé mais que le retour à la ligne se produit quand même dans la zone de texte. Pour pouvoir aussi convertir les fins de lignes et les retours chariots (\n et \r), utilisez la fonction addcslashes() et indiquez en deuxième paramètre la liste des caractères à échapper.
<textarea>
<?php
$cc = "Hello ' \n PHP!";
echo addcslashes($cc,"'\n");
?>
</textarea>
Affichage
Vous pouvez faire l’opération inverse et récupérer une chaine échappée pour la transformer en chaine simple grâce au fonction stripslashes() et stripcslashes()
<textarea>
<?php
$cc = "Hello \' PHP!";
echo stripslashes($cc);
?>
</textarea>
Affichage
Protection pour HTML
Lorque PHP envoie, pour l’affichage d’éléments dans une page HTML, certains caractères réservés en HTML comme <>, ils seront interprétés et non affichés tels quels. Ainsi <br?> provoquera un changement de ligne.
Conversion des entités
PHP peut convertir les caractères spéciaux (<, >, et &) en entités HTML avec la fonction htmlspecialchars()
<?php
$cc = "bonjour < ' <br> daniel";
echo htmlspecialchars($cc);
?>
Affichage
bonjour < ' <br> daniel
Par défaut seul les caractères <> et & sont protégés mais pas l’apostrophe sauf si vous utilisez comme deuxième paramètre la valeur ENT_QUOTES
<?php
$cc = "bonjour < ' <br> daniel";
echo htmlspecialchars($cc,ENT_QUOTES);
?>
Si vous regarder le code source de la page, on s’aperçoit que l’apostrophe est protégé
bonjour &lt; ' <br> daniel
Il est possible de convertir tous les caractères spéciaux sous forme d’entités (comme les caractères accentués) avec la fonction htmlentities()
<?php
$cc = "bonjour < é <br> daniel";
echo htmlentities($cc);
?>
Code source
Si vous regarder le code source de la page, on s’aperçoit que le é est protégé
bonjour &lt; é <br> daniel
Si vous voulez réaliser l’opération inverse, vous devez utiliser la fonction html_entity_decode().
Conversion des changements de lignes
En HTML le caractère de fin de ligne \n est considéré comme une espace (ou caractère blanc). Pour transformer les retours à la ligne \n en changement de ligne HTML <br>, utiliser la fonction nl2br()
<?php
$cc = "bonjour \n daniel";
echo $cc;
echo "<br>";
echo nl2br($cc);
?>
Affichage
bonjour daniel
bonjour
daniel
Suppression des balises HTML
Une autre manière de protéger les sorties HTML est de supprimer les balises avec la fonction strip_tags(). Cette fonction peut néanmoins autoriser certaines balises si elles sont listées en deuxième paramètre de la fonction
<?php
$cc = "<em>bonjour</em> <sub>daniel</sub> et <sup>robert</sup>";
echo $cc; // pas de suppression de balises
echo "<br>";
echo strip_tags($cc,'<em>'); // suppression de toutes les balise sauf <em>
?>
Affichage
bonjourdaniel etrobert
bonjour daniel et robert
Dans cet exemple, sur la deuxième ligne, toutes les balises sont supprimées sauf la balise em.