Sécuriser les formulaires

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


link182
WRInaute impliqué
WRInaute impliqué
 
Messages: 473
Inscription: Mar Juil 26, 2005 13:30

Sécuriser les formulaires

Message le Ven Jan 27, 2006 9:55

bonjour,
j'aimerais sécuriser les champs INPUT (text, textarea) où il y a de la saisie clavier, lorsque je recupere mes variable via $_POST['maVariable'].

Faut-il utiliser htmlentities ?


e-kiwi
Modérateur
Modérateur
 
Messages: 13853
Inscription: Mar Déc 23, 2003 9:04

Message le Ven Jan 27, 2006 9:57

ca depend ce que tu appelles "sécuriser"


dmathieu
Modérateur
Modérateur
 
Messages: 6925
Inscription: Ven Jan 09, 2004 16:21

Message le Ven Jan 27, 2006 10:07

les deux choses principales à vérifier sont :
la présence ou non de " et ', et ajouter des \ devant.
fonction pour cela : addslashes

la présence ou non de balises html, et l'affichage de celles-ci comme du texte
fonction : htmlentities

donc :
Code: Tout sélectionner
$text = addaslashes(htmlentities($text));

zimounet
WRInaute accro
WRInaute accro
 
Messages: 1796
Inscription: Lun Nov 08, 2004 20:57

Message le Ven Jan 27, 2006 10:23

mysql_real_escape_string


link182
WRInaute impliqué
WRInaute impliqué
 
Messages: 473
Inscription: Mar Juil 26, 2005 13:30

Message le Ven Jan 27, 2006 11:24

zimounet : c'est-à-dire ?

shrom
WRInaute passionné
WRInaute passionné
 
Messages: 865
Inscription: Lun Juil 05, 2004 22:37

Message le Ven Jan 27, 2006 12:52

La question de la sécurité des formulaire est un vaste sujet et dépend fortement de ce que tu veux faire de tes données.

1) insertion dans une base de données, il faut se protéger des injections SQL:
- si le champs est un entier ou un flottant on transtype avec (int) ou (float)
- si c'est un champs texte, on s'assure qu'il ne contient que des caratères autorisés ( ex: un code postal français a une longueur de 5 caractères et ne doit comporter que des chiffres )
- on passe toutes les variables de type texte à la fonction mysql_real_escape_string si on utilise MySQL ou l'équivalent pour un autre SGBD, proscrire addslashes qui n'échappe que ' et ce n'est pas suffisant

2) afficher les données, il faut se protéger du cross site scripting, on utilise mb_convert_encoding( $str, "HTML_ENTITIES", "auto" ); avant l'affichage car la fonction htmlentities ne protège pas du XSS UTF-7 ou alors utiliser une fonction qui supprime les tag HTML non désirés

3) Envoyer par mail, il faut se protéger de l'injection d'en-têtes:
il faut filtrer les champs pour qu'ils ne contiennent rien de ce qui suit:
"\r","\n","%0ad", "%0AD","%0d","%0D","Content-Type:","bcc:","to:","cc:"

C'est le minimum, on pourrait rédiger un bouquin sur les failles les plus courantes.


link182
WRInaute impliqué
WRInaute impliqué
 
Messages: 473
Inscription: Mar Juil 26, 2005 13:30

Message le Ven Jan 27, 2006 14:09

merci pour ses infos.
Pour l'insertion dans une base Mysql, il faut utiliser sprinf pour formater les variable dans une string SQL comme ceci :

$sql = sprinf("INSERT INTO toto values (".mysql_real_escape_string($_POST['variable']).")", %s);
$req = mysql_query($sql, $db);


TOMHTML
WRInaute accro
WRInaute accro
 
Messages: 3243
Inscription: Mer Aoû 25, 2004 14:05

Message le Ven Jan 27, 2006 14:21

merci shrom t'as bien résumé le truc et j'ai appris des choses, ça sert (et ça va encore me servir pour ma part...)

oui tu pourrais rédiger un bouquin sur le sujet ;)

shrom
WRInaute passionné
WRInaute passionné
 
Messages: 865
Inscription: Lun Juil 05, 2004 22:37

Message le Ven Jan 27, 2006 16:27

link182 a écrit:Pour l'insertion dans une base Mysql, il faut utiliser sprinf pour formater les variable dans une string SQL comme ceci :

$sql = sprinf("INSERT INTO toto values (".mysql_real_escape_string($_POST['variable']).")", %s);
$req = mysql_query($sql, $db);


C'est une bonne idée, mais ça ne dispense pas de faire les tests avant et d'interrompre le programme si une variable ne correspond pas à ce qu'on attend.

Une requête comme celle-ci est encore plus dangeureuse avec sprintf que sans.
Code: Tout sélectionner
$sql = "UPDATE matable SET flag='%s' WHERE champs=%d";


Si la variable allant à la place de champs contient 'ee', on se retrouve avec une requête:
Code: Tout sélectionner
UPADTE matable SET flag='un flag' WHERE champs=0


Et hop, on met à jour tous les enregistrements dont champs=0, ce n'était pas vraiment prévu.

.

yann214
WRInaute impliqué
WRInaute impliqué
 
Messages: 366
Inscription: Jeu Nov 17, 2005 8:59

Message le Lun Jan 30, 2006 11:09

Merci pour ces infos très claires !!!

Y a-t-il une fonction inverse pour mysql_real_escape_string ?


link182
WRInaute impliqué
WRInaute impliqué
 
Messages: 473
Inscription: Mar Juil 26, 2005 13:30

Message le Mer Fév 01, 2006 10:51

Il y a t-il en PHP des fonctions permettant de connaitre le type d'une variable ?

shrom
WRInaute passionné
WRInaute passionné
 
Messages: 865
Inscription: Lun Juil 05, 2004 22:37

Message le Mer Fév 01, 2006 15:41

link182 a écrit:Il y a t-il en PHP des fonctions permettant de connaitre le type d'une variable ?


is_int, is_float, is_array etc ... pour vérifier le type

gettype pour récupérer le type.

zimounet
WRInaute accro
WRInaute accro
 
Messages: 1796
Inscription: Lun Nov 08, 2004 20:57

Message le Mer Fév 01, 2006 16:36

Code: Tout sélectionner
$titre = mysql_real_escape_string($_POST['titre']);


Ca fonctionne ca si on a déjà ouvert la connexion au serveur sql?

shrom
WRInaute passionné
WRInaute passionné
 
Messages: 865
Inscription: Lun Juil 05, 2004 22:37

Message le Mer Fév 01, 2006 22:50

zimounet a écrit:
Code: Tout sélectionner
$titre = mysql_real_escape_string($_POST['titre']);


Ca fonctionne ca si on a déjà ouvert la connexion au serveur sql?


il faut même que la connexion soit ouverte pour que ça fonctionne sinon elle tente d'en ouvrir une avec les paramètres pardéfaut du php.ini

Attention car ça ne protège que des injections SQL sur des champs texte, ça ne protège pas de l'injection sur des entiers ni des autres failles de type XSS ou CSRF.

vachomatic
Nouveau WRInaute
 
Messages: 7
Inscription: Dim Mai 06, 2007 19:22

précision

Message le Lun Juil 09, 2007 21:43

Bonjour à tous,

Petite rectification sur une faute de frappe dans la contribution de kazhar, pour les formulaire PHP sans SQL :

$text = addslashes(htmlentities($text));

A+ Vachomatic


Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités