[Fonction] Sécurité : filtre XSS et injections SQL
Posté : 14 mai 2006, 11:08
hello
voici ma fonction pour filtrer toute variable utilisateur (superglobale), basée entre autres sur les explications de Damien :
Exemple : Dans une requête sql, lorsque vous attribuez une valeur à un champ, encadrez bien cette valeur par des guillemets simples (apostrophes). Certains les laissent tomber, grave erreur ! La protection anti injection sql est alors inefficace.
voici ma fonction pour filtrer toute variable utilisateur (superglobale), basée entre autres sur les explications de Damien :
<?php
/*
fonction de filtrage (sécurité) des superglobales (variables utilisateurs $_GET, $_POST, $_COOKIE, $_REQUEST, $_FILES)
Auteur : Patami ([email protected])
Fonction valide pour PHP 4
*/
/*
### mode d'emploi ###
Appliquez la fonction getval() sur toute variable superglobale (variables utilisateurs $_GET, $_POST, $_COOKIE, $_REQUEST, $_FILES).
Il y a 4 attributs. Seul le 1er est obligatoire (les 3 autres ont comme valeur par défaut 0) !
1er attribut : la variable qui doit être filtrée.
2e attribut : le type de contenu (mettre 1 si c'est un nombre, sinon mettre 0)
3e attribut : activer le filtrage spécifique à la base de donnée (mettre 1 si vous utilisez cette variable dans une requête SQL, sinon 0)
4e attribut : activer le filtrage anti url (mettre 1 pour saborder toutes les url, sinon mettre 0). A utiliser pour les include() entre autres.
*/
function getval($var, $type=0, $bdd=0, $filtre_url=0)
{
///anti XSS
if ($filtre_url == 0)
{
$value = ($type == 0) ? htmlspecialchars($var, ENT_NOQUOTES) : intval($var);
}
else
{
$value = ($type == 0) ? str_replace(array(':','/','.'), '', htmlspecialchars($var, ENT_NOQUOTES)) : intval($var);
}
///anti injection SQL
if ($bdd != 0)
{
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
if (function_exists('mysql_real_escape_string'))
{
$value = mysql_real_escape_string($value);
}
//pour version de PHP < 4.3.0 on utilise addslashes
else
{
$value = addslashes($value);
}
}
///on retourne une valeur filtrée
return $value;
}
?>
Cette fonction ne fait pas tout, il faut à côté de cela coder proprement.Exemple : Dans une requête sql, lorsque vous attribuez une valeur à un champ, encadrez bien cette valeur par des guillemets simples (apostrophes). Certains les laissent tomber, grave erreur ! La protection anti injection sql est alors inefficace.