Sécuriser les formulaires

WRInaute occasionnel
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 ?
 
WRInaute accro
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:
$text = addaslashes(htmlentities($text));
 
WRInaute impliqué
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.
 
WRInaute occasionnel
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);
 
WRInaute passionné
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 ;)
 
WRInaute impliqué
link182 a dit:
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:
$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:
 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.

.
 
WRInaute passionné
Code:
$titre = mysql_real_escape_string($_POST['titre']);

Ca fonctionne ca si on a déjà ouvert la connexion au serveur sql?
 
WRInaute impliqué
zimounet a dit:
Code:
$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.
 
V
vachomatic
Guest
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
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut