Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/09/2006, 12h08   #1
Inscrit
 
Inscription : juin 2006
Messages : 531
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 531
Points : 225
Points : 225
Par défaut [Sécurité] intval() ou mysql_real_escape_string() ?

Bonjour,

Je reçois des données de type numérique depuis un formulaire et je viens de trouver la fonction intval(), qui converti les chaines de caractères en nombre si j'ai tout compris.

Donc finalement, intval() ne serait-il pas préférable à mysql_real_escape_string() pour éviter que l'on me trafique ma requête ?
JackBeauregard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2006, 12h31   #2
Inscrit
 
Inscription : juin 2006
Messages : 531
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 531
Points : 225
Points : 225
si je fais ça, c'est sauvage ou pas :
Code :
1
2
 
$var=htmlentities(mysql_real_escape_string(intval($var)));
JackBeauregard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2006, 12h34   #3
Membre régulier
 
Avatar de elitemedia
 
Inscription : août 2006
Messages : 115
Détails du profil
Informations personnelles :
Localisation : Suisse

Informations forums :
Inscription : août 2006
Messages : 115
Points : 92
Points : 92
intval() ne te permet que de convertir une variable en une valeur numérique entière, et n'est pas concue pour te proteger.

mysql_real_escape_string() en revanche est une fonction destiné à la sécurité.

Pour ce qui me concerne, j'ai pris l'habitude d'utiliser systématiquement mysql_real_escape_string() avant toute requete ou est envoyé des données par l'utilisateur, et j'utilise intval() en supplément de mysql_real_escape_string() si les valeurs sont censés être numériques.
elitemedia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2006, 12h37   #4
Membre chevronné
 
Inscription : mars 2005
Messages : 583
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 583
Points : 651
Points : 651
hello,

les deux ont pas grand chose a voir

dans ton cas il serait peut etre plus intéressant de vérifier qu'on t'a bien envoyé des données numériques : is_numeric est pas mal pour ça.

maintenant si tu veux exclusivement des entiers tu peux passer par ça :

intval( $mavar ) == $mavar

qui permet de passer le probleme du au fait que les données POST ou GET sont considérées comme des chaines et qui du coup échouent au test is_int();

mysql_real_escape_string est faite pour échapper les chaines de caractères qui pourraient fausser tes requetes. c'est pas tout à fait pareil
Petibidon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2006, 12h44   #5
Inscrit
 
Inscription : juin 2006
Messages : 531
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 531
Points : 225
Points : 225
Bah en fait je veux que la variable de la requête utilise des chiffres, ce qui est le cas si elle n'a pas été trafiquée. Donc normalement si j'utilise intval, elle va me convertir la variable en chiffre, donc ne rien faire si c'est déjà un chiffre, sinon elle va me sortir un zéro, ce qui n'est pas en soit un problème. Donc normalement c'est sécurisé avec intval(), non ?
JackBeauregard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2006, 12h51   #6
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

Ceci est complètement absurde (passe-moi l'expression) :
Citation:
$var=htmlentities(mysql_real_escape_string(intval($var)));
D'une part, intval() te permet d'obtenir une valeur numérique entière, ce qui empêche de manière très effective toute tentative d'injection SQL. Essaie de faire une injection en n'utilisant que des entiers et appelle-moi si tu y parviens
D'autre part, va trouver un caractère à encodage particulier qui nécessite mysql_real_escape_string() si tu attends un entier...
Enfin, et ce sujet a été traité maintes fois sur ce forum, htmlentities() n'est pas prévu pour stocker en base de données mais pour envoyer un flux HTML au client. De plus, les entiers n'ont pas d'entités HTML.

Bref, il est absurde de convertir un entier car c'est la donnée la plus sécurisée que tu puisses obtenir.
Pour envoyer dans une requête : utilise intval() tant que possible, sinon mysql_real_escape_string(), mais rien d'autre.
Pour envoyer au navigateur : htmlentities() si ce n'est pas un nombre.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2006, 13h01   #7
Inscrit
 
Inscription : juin 2006
Messages : 531
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 531
Points : 225
Points : 225
donc si je vais intval($var) c'est plus que suffisant dans la mesure où j'attend un chiffre dans ma requête et si je fais mysql_real_escape_string(intval($var)) c'est juste pour me rassurer ? Et si je tombe sur un warrior du piratage qui me sort un code à double action pour neutraliser intval() n'est-ce pas valable d'avoir encore un mysql_real_escape_string() sous la main ? Ou c'est de la superstition totale ?
JackBeauregard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2006, 13h11   #8
Membre régulier
 
Avatar de elitemedia
 
Inscription : août 2006
Messages : 115
Détails du profil
Informations personnelles :
Localisation : Suisse

Informations forums :
Inscription : août 2006
Messages : 115
Points : 92
Points : 92
il me semble que la réponse de Yogui est plus que clair et réponde suffisament à tes questions non ?
elitemedia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2006, 13h15   #9
Inscrit
 
Inscription : juin 2006
Messages : 531
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 531
Points : 225
Points : 225
Tu veux que je te réponde oui alors je vais te dire oui comme ça ça ira.
JackBeauregard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2006, 13h15   #10
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Dans ce cas, échapper la variable ne sert qu'à perdre dutemps processeur et à rendre ton code moins portable. Donc à rien.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2006, 13h15   #11
Inscrit
 
Inscription : juin 2006
Messages : 531
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 531
Points : 225
Points : 225
ok ça roule, merci Yogui.
JackBeauregard est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h49.


 
 
 
 
Partenaires

Hébergement Web