Echapement des caractères spéciaux, htmlspecialchars...
Par Benjamin Simon le mardi, mars 3 2009, 14:32 - php - Lien permanent
A chaque fois, c'est ma même chose ! Comment gérer les guillemets magiques, les échappements des caractères spéciaux avant insertion dans une base de donnée (injections SQL ça vous dit quelque choses!), l'affichage des caractères html...
les guillemets magiques
Première chose à faire, que nous dit la documentation php, c'est de désactiver les guillemets magiques.Pour cela plusieurs solutions qui vous sont décrite sur : Désactiver les guillemets magiques. En effet selon la configuration du serveur, l'une ou l'autre méthode n'est pas possible.
Avec un un fichier php.ini :
; Magic quotes
;
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off
Avec un fichier .htaccess :
php_flag magic_quotes_gpc Off
ou avec une désactivation de magic_quotes_gpc à l'exécution :
<?php
if (get_magic_quotes_gpc()) {
function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);
return $value;
}
$_POST = array_map('stripslashes_deep', $_POST);
$_GET = array_map('stripslashes_deep', $_GET);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
$_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
?>
Cette méthode est inefficace, et il est recommandé d'utiliser les autres solutions si possible.
Les échappements des caractères spéciaux
Maintenant que nos variables globales ($_GET, $_POST, $_REQUEST) ne sont plus protégées, nous allons utiliser la fonction php mysql_real_escape_string. L'utilisation de la fonction mysql_real_escape_string() sur chaque variable évite les injections SQL.Exemple :
// Requête
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
Les caractères html
Selon le besoin il est nécessaire de ne pas afficher les caractères html.- htmlspecialchars — Convertit les caractères spéciaux en entités HTML. Normalement, si l'encodage du document est bon, il n'y a pas besoin d'utiliser htmlentities — qui lui convertit lui tous les caractères éligibles en entités
HTML.
- ereg_replace("<[^>]*>", "", $texte) - Supprime complètement le balisage html.