Après m'être fait tronquer une base de données, injecter du code malveillant dans le header du site et voir mon htaccess modifié pour rediriger vers des sites bizarres (oui c'est à peu près tout, sauf peut être un site qui ma générer des images bizarres sur mon générateur de bannière pour webmaster où j'avais oublié de sécuriser une variable

) j'ai lu pas mal de tutos sur les injections SQL et j'ai décidé de sécuriser et de ne plus faire confiance à ce que l'utilisateur peut entrer (la première règle!)
Je vous partage mes fonctions qui me suivent dans tous mes projets, qui sont indispensables pour moi et la sécurité des sites que je crée.
Fonction htmlent()
La fonction suivante sécurise les données entrées par l'utilisateur, créée depuis pas mal de temps et améliorée depuis le temps car au début j'utilisais seulement htmlentities($ma_var)
function htmlent($texte){
$arr=["#","\\","--"];
$inarr=0;
do {
//si le dernier caractère est un signe qu'on ne souhaite pas ($arr) on le retire, pour éviter les injections SQL et autre bug qui pourrait être causé lors du transfert de table (ou autre car le \ pourrait simplement omettre le ' de la requete)
if(in_array(substr($texte,-1,1),$arr)){
$texte=substr($texte,0,-1);
$inarr=1;
} else
$inarr=0;
} while($inarr==1);
//on retourne le texte bien écarté de toutes faille (il y en a toujours ceci dit...)
//on le passe à trim pour supprimer espaces et saut de ligne en début et fin de chaine
return trim(htmlentities($texte,ENT_QUOTES,"UTF-8"));
}
Du coup je m'en sert pour sécuriser mes requêtes comme ceci:
"INSERT INTO table SET nom='".htmlent($_POST['nom'])."'...
"SELECT * FROM table WHERE id='".htmlent($_GET['id'])."'...
Fonction verif()
La fonction suivante permet de s'assurer que ce qui à été saisie par l'utilisateur et bien ce que l'on attends
function verif($type,$chaine){
if($type=='mail'){
if(preg_match("#^[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?@[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?\.[a-z]{2,30}$#i",$chaine))
return true;//c'est cadeau la regex, quelques années à la peaufiner celle là ;) utilisée pour la page d'inscription, de contact et autre formulaire où il faut saisir un mail
}elseif($type=='num'){
if(preg_match("#^[0-9]+$#",$chaine))
return true;//la vérification que j'utilise le plus, simple et effiace, je ne préfère pas utiliser is_numeric() ou is_int car il accepte plus que [0-9]+..., là je suis certifié avoir un chiffre ou une suite de chiffres à l'arrivée ;)
}elseif($type=='site'){
if(preg_match("#^https?:\/\/(www\.)?[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?\.[a-z]{2,30}((\/[a-z0-9_-]+){1,})?$#i",$chaine))
return true;//vérifie si c'est un URL, celle ci aussi depuis quelques années à l'améliorer, elle autorise un nombre illimité de sous domaine et vérifie si il y a des dossiers (et seulement des dossiers!) ou pas après le domaine ;)
}elseif($type=='image'){
if(preg_match("#\.(jpg|jpeg|png|gif)$#i",$chaine))
return true;// je l'utilise pour l'upload de photo, ça me permet de vérifier l'extension du fichier
}
//si rien est OK, on retourne false
return false;
}
Je l'utilise comme ceci (exemple):
if(isset($_GET['action'],$_GET['id']) && verif("num",$_GET['id'])){
$id=$_GET['id'];
if($_GET['action']=="supprimer"){
if(requete("DELETE FROM table WHERE id=$id"))
echo "Supprimé!";
...
Bien sûr on peut imaginer d'autres vérifications avec cette fonction...
Et vous, qu'utilisez-vous pour protéger vos sites ? Question sensible ? Les pirates peuvent voir comment on procède et tenter de contourner nos protections, j'en doute pas une seconde!
Après m'être fait tronquer une base de données, injecter du code malveillant dans le header du site et voir mon htaccess modifié pour rediriger vers des sites bizarres (oui c'est à peu près tout, sauf peut être un site qui ma générer des images bizarres sur mon générateur de bannière pour webmaster où j'avais oublié de sécuriser une variable #-o ) j'ai lu pas mal de tutos sur les injections SQL et j'ai décidé de sécuriser et de ne plus faire confiance à ce que l'utilisateur peut entrer (la première règle!)
Je vous partage mes fonctions qui me suivent dans tous mes projets, qui sont indispensables pour moi et la sécurité des sites que je crée.
[size=200]Fonction htmlent()[/size]
La fonction suivante sécurise les données entrées par l'utilisateur, créée depuis pas mal de temps et améliorée depuis le temps car au début j'utilisais seulement htmlentities($ma_var)
[PHP]function htmlent($texte){
$arr=["#","\\","--"];
$inarr=0;
do {
//si le dernier caractère est un signe qu'on ne souhaite pas ($arr) on le retire, pour éviter les injections SQL et autre bug qui pourrait être causé lors du transfert de table (ou autre car le \ pourrait simplement omettre le ' de la requete)
if(in_array(substr($texte,-1,1),$arr)){
$texte=substr($texte,0,-1);
$inarr=1;
} else
$inarr=0;
} while($inarr==1);
//on retourne le texte bien écarté de toutes faille (il y en a toujours ceci dit...)
//on le passe à trim pour supprimer espaces et saut de ligne en début et fin de chaine
return trim(htmlentities($texte,ENT_QUOTES,"UTF-8"));
}[/PHP]
Du coup je m'en sert pour sécuriser mes requêtes comme ceci:
[PHP]"INSERT INTO table SET nom='".htmlent($_POST['nom'])."'...[/PHP]
[PHP]"SELECT * FROM table WHERE id='".htmlent($_GET['id'])."'...[/PHP]
[size=200]Fonction verif()[/size]
La fonction suivante permet de s'assurer que ce qui à été saisie par l'utilisateur et bien ce que l'on attends
[PHP]function verif($type,$chaine){
if($type=='mail'){
if(preg_match("#^[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?@[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?\.[a-z]{2,30}$#i",$chaine))
return true;//c'est cadeau la regex, quelques années à la peaufiner celle là ;) utilisée pour la page d'inscription, de contact et autre formulaire où il faut saisir un mail
}elseif($type=='num'){
if(preg_match("#^[0-9]+$#",$chaine))
return true;//la vérification que j'utilise le plus, simple et effiace, je ne préfère pas utiliser is_numeric() ou is_int car il accepte plus que [0-9]+..., là je suis certifié avoir un chiffre ou une suite de chiffres à l'arrivée ;)
}elseif($type=='site'){
if(preg_match("#^https?:\/\/(www\.)?[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?\.[a-z]{2,30}((\/[a-z0-9_-]+){1,})?$#i",$chaine))
return true;//vérifie si c'est un URL, celle ci aussi depuis quelques années à l'améliorer, elle autorise un nombre illimité de sous domaine et vérifie si il y a des dossiers (et seulement des dossiers!) ou pas après le domaine ;)
}elseif($type=='image'){
if(preg_match("#\.(jpg|jpeg|png|gif)$#i",$chaine))
return true;// je l'utilise pour l'upload de photo, ça me permet de vérifier l'extension du fichier
}
//si rien est OK, on retourne false
return false;
}[/PHP]
Je l'utilise comme ceci (exemple):
[PHP]if(isset($_GET['action'],$_GET['id']) && verif("num",$_GET['id'])){
$id=$_GET['id'];
if($_GET['action']=="supprimer"){
if(requete("DELETE FROM table WHERE id=$id"))
echo "Supprimé!";
...[/PHP]
Bien sûr on peut imaginer d'autres vérifications avec cette fonction...
Et vous, qu'utilisez-vous pour protéger vos sites ? Question sensible ? Les pirates peuvent voir comment on procède et tenter de contourner nos protections, j'en doute pas une seconde!