Sécuriser les formulaires
15 messages
• Page 1 sur 1
-

dmathieu - Modérateur

- Messages: 7245
- Inscription: 9 Jan 2004
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 :
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));
- shrom
- WRInaute impliqué

- Messages: 865
- Inscription: 5 Juil 2004
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.
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

- Messages: 474
- Inscription: 26 Juil 2005
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);
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);
- shrom
- WRInaute impliqué

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

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

- Messages: 865
- Inscription: 5 Juil 2004
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: 6 Mai 2007
précision
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
Petite rectification sur une faute de frappe dans la contribution de kazhar, pour les formulaire PHP sans SQL :
$text = addslashes(htmlentities($text));
A+ Vachomatic
15 messages
• Page 1 sur 1
Lectures recommandées sur ce thème :
- Sécuriser un Cookie d'authentification
- sécuriser un service web ?
- Sécuriser son Pc Reflexions
- Sécuriser WordPress et IPB
- sécuriser un serveur postfix ?
- sécuriser un site au minimum
- Comment sécuriser le wifi ?
- Sécuriser un hébergement dédié ?
- Sécuriser l'acces à mysql
- Sécuriser un blog Wordpress en 7 étapes
- Google Secure Access (GSA) - 20-09-2005
Consultez la description détaillée des produits ou services de Google suivants : Google Secure Access
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités


