Sécuriser les formulaires


link182
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 474
Inscription: 26 Juil 2005

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: 15544
Inscription: 23 Déc 2003

Message le Ven Jan 27, 2006 9:57

ca depend ce que tu appelles "sécuriser"


dmathieu
Modérateur
Modérateur
 
Messages: 7245
Inscription: 9 Jan 2004

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 passionné
WRInaute passionné
 
Messages: 1796
Inscription: 8 Nov 2004

Message le Ven Jan 27, 2006 10:23

mysql_real_escape_string


link182
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 474
Inscription: 26 Juil 2005

Message le Ven Jan 27, 2006 11:24

zimounet : c'est-à-dire ?

shrom
WRInaute impliqué
WRInaute impliqué
 
Messages: 865
Inscription: 5 Juil 2004

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 occasionnel
WRInaute occasionnel
 
Messages: 474
Inscription: 26 Juil 2005

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: 3250
Inscription: 25 Aoû 2004

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 impliqué
WRInaute impliqué
 
Messages: 865
Inscription: 5 Juil 2004

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 occasionnel
WRInaute occasionnel
 
Messages: 370
Inscription: 17 Nov 2005

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 occasionnel
WRInaute occasionnel
 
Messages: 474
Inscription: 26 Juil 2005

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 impliqué
WRInaute impliqué
 
Messages: 865
Inscription: 5 Juil 2004

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 passionné
WRInaute passionné
 
Messages: 1796
Inscription: 8 Nov 2004

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 impliqué
WRInaute impliqué
 
Messages: 865
Inscription: 5 Juil 2004

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
Nouveau WRInaute
 
Messages: 7
Inscription: 6 Mai 2007

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


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

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