ceadreak
Messages postés1Date d'inscriptionlundi 29 novembre 2010StatutMembreDernière intervention19 janvier 2010 19 janv. 2010 à 15:42
Merci pour ta classe, je l'ai implémenté dans mon framework et elle fonctionne à merveille, avec quelques modifs bien sur :)
Par contre une petite question, pourquoi utilise-tu une fonction de cryptage et pas directement la fonction PASSWORD() de MySQL?
Ceci dit, je l'ai laissé comme ca pour ma classe d'abstraction PSQL
Encore merci ! Ca m'a évité pas mal de taf :)
cs_mdc888
Messages postés24Date d'inscriptionmardi 14 juin 2005StatutMembreDernière intervention 3 janvier 2012 8 janv. 2010 à 14:08
Oups, oubliez le post au dessus;
Vu que ces 2 lignes posaient pb :
Pour ceux qui veulent que ca fonctionne rapidement, remplacez-les par :
$username_input = mysql_real_escape_string($username_input);
$password_input = mysql_real_escape_string($password_input);
Mais AMHA il faut aller un peut plus loin dans la protection contre les injections...
cs_mdc888
Messages postés24Date d'inscriptionmardi 14 juin 2005StatutMembreDernière intervention 3 janvier 2012 7 janv. 2010 à 13:41
Salut à tous,
Je déterre ce sujet car il m'intéresse au plus haut point. Je suis en fait en train de faire la même chose pour un gros site, et je suis tombé sur cette source.
J'ai plusieurs remarques à faire, notamment au niveau injection SQL.
AMHA, il serait bon de prévoir un sprintf avec un mysql_real_escape_string lorsqu'on interroge la base à partir du POST...
Vous allez dire : l'utilisateur n'a qu'a protéger ce POST avec un addslashes, mais je ne suis pas sur que ce soit aussi propre (mais je peux me tromper ;) )
damnedc
Messages postés1Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention20 février 2008 20 févr. 2008 à 14:05
je comprends pas pourquoi il y a erreur : Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /mnt/157/sda/0/0/damnedc/index.php on line 6
slaxswf
Messages postés32Date d'inscriptionjeudi 28 décembre 2006StatutMembreDernière intervention20 mai 2007 15 mai 2007 à 12:09
InnoDB sessions at the 2007 MySQL User Conference
Il serait pratique de mettre à jour ta source et de proposer un fichier ZIP COMPLET avec la class abstraite mysql de malalam ;)
Pour ma part il manque des points-virgules à la fin de tes requêtes de création de table mysql ;)
++ Merci d'avance.
cs_wizad
Messages postés355Date d'inscriptionsamedi 30 octobre 2004StatutMembreDernière intervention14 avril 2009 5 févr. 2007 à 00:32
Tout à fait, la classe n'utilise aucune référence à mysql. Il suffit de créer une classe gérant sql_server (ou de regarder du coté de la classe de malalam) répondant au objet $db de cette classe (query et fetch_assoc essentiellement).
Bkdenice
Messages postés2Date d'inscriptionvendredi 9 septembre 2005StatutMembreDernière intervention 4 février 2007 4 févr. 2007 à 20:32
Bonjour,
Tous d'abord merci pour ce script
Mais j'ai une Question
Et-il possible de le faire pour Microsft SQL Serveur ?
Merci d'avance
cs_wizad
Messages postés355Date d'inscriptionsamedi 30 octobre 2004StatutMembreDernière intervention14 avril 2009 1 janv. 2007 à 16:32
oui pas fait attention en faite il s'agit d'une fonction destinée à éviter les injections sql (et tout autre tentative)
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 28 déc. 2006 à 18:54
Cette fonction est normalement mise dans une classe pour SGBD.
Voila pourquoi elle est à l'extérieur, elle n'a rien à faire dans cette classe.
cs_lilole
Messages postés1Date d'inscriptionmercredi 27 décembre 2006StatutMembreDernière intervention28 décembre 2006 28 déc. 2006 à 14:34
Salut, que fait la fonction traiteVar car elle n'ai pas dans la classe session ?
cf ci-dessous :
public function AuthUser($username_input, $password_input)
{
$this->msg_error = '';
$username_input = mysql_real_escape_string(traiteVar($username_input, 0));
$password_input = mysql_real_escape_string(traiteVar($password_input, 0));
dubaddxx
Messages postés6Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention14 décembre 2006 14 déc. 2006 à 21:56
oué en fait je vais revoir ma copie je crois ...
je vais mettre de l'ordre dans ma tête et dans mon code car là je m'y perds aussi :op
cs_wizad
Messages postés355Date d'inscriptionsamedi 30 octobre 2004StatutMembreDernière intervention14 avril 2009 14 déc. 2006 à 14:58
En fait j'arruive pas non plus à suivre ton raisonnemet...
(mdr kankrelune)
kankrelune
Messages postés1293Date d'inscriptionmardi 9 novembre 2004StatutMembreDernière intervention21 mai 2015 14 déc. 2006 à 14:07
"si j'en fais un singleton et que la connexion à la base pète"
J'ais du mal à voir ce que tu veux dire... pourquoi veux tu que la connection "pète"... tu lui donne à manger du choux ? lOoOl... .. . ;o)
@ tchaOo°
dubaddxx
Messages postés6Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention14 décembre 2006 14 déc. 2006 à 14:00
Mouais, sachant que mon objet $user contient une référence à la connexion($db est une des propriétés), si j'en fais un singleton et que la connexion à la base pète, je ne sais pas comment l'appli comportera, puisque j'utiliserais des méthodes de UserManager qui feront référence à une connexion non valide.
Tant que je n'ai pas de problèmes de performances, je vais garder le système tel quel en fait.
Lorsque j'aurais plusieurs centaines de connexions simultanées (et là si j'y arrive un jour c'est jackpot!) ça sera une autre histoire ...
Merci pour vos conseils
Ben
kankrelune
Messages postés1293Date d'inscriptionmardi 9 novembre 2004StatutMembreDernière intervention21 mai 2015 14 déc. 2006 à 11:25
Bah tu peux toujours stocker ton object user en session mais il faudra réouvrir la connection avec la bdd de toute façon... sinon rien ne t'empeche de faire un singleton, le singleton permet d'utiliser une instance unique d'une class pour tous les objet instancié de cette class rien à voir avec le stockage à la fin de l'éxécution du script... .. .
@ tchaOo°
cs_wizad
Messages postés355Date d'inscriptionsamedi 30 octobre 2004StatutMembreDernière intervention14 avril 2009 13 déc. 2006 à 18:13
Vu que en PHP le script est terminé, fermé et les ressource libéré une fois la fin de l'interpretation il faut effectivement recrée les différents objets. Et je ne connais pas de moyen de les conservers d'une page à l'autre.
Pour le reste de ton post je lit ça tranquillement dés que possible avant de te conseiller.
dubaddxx
Messages postés6Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention14 décembre 2006 13 déc. 2006 à 18:06
>> l'objet session doit être recréé dans chaque page
Donc si je comprends bien, pas question ici de mettre en place un Singleton pour économiser des ressources ?
Toujours dans mon apprentissage de newbie, j'ai défini une classe UserManager avec son constructeur UserManager($db), qui me permet de récupérer la connexion à la base.
un exemple de mon code est
$user_manager new UserManager($db); // le constructeur fait juste un "$this->db $db";
$user_id = $session->GetUserId(); // que j'ai aussi rajouté dans la classe Session
puis enfin je peux manipuler l'objet user_manager:
$user_manager->addProperty($user_id, $property, $value); // INSERT des propriétés dans une table USERPROPERTY
Je ne suis pas forcément convaincu de cette manière de faire, je ne sais pas si je m'y prends bien. (d'autant plus que j'ai plusieurs classes dans le même genre, DVDManager, etc.)
En plus, comme je dois recréer l'objet $user_manager à chaque page ou je fais des opérations sur mes utilisateurs (CreateUser, RemoveUser ...), je pensais transformer ma classe UserManager en singleton, de manière à toujours récupérer la connexion valide.
Quelqu'un voit une autre manière plus élégante de faire, ou bien pourrait me donner son avis sur la chose ?
Merci
Ben
masternico
Messages postés487Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention 1 septembre 2011 29 nov. 2006 à 23:09
wow, ça défrise une classe comme ça (je reviens de la classe de base de données).
Je m'incline devant une telle oeuvre.
Je manque encore de pratique pour bien en saisir toute la portée, mais c'est superbe. En conjontion avec le présent code, ça donne un truc bien sympa. Merci les gars et encore bravo
10/10 pour ma part
cs_wizad
Messages postés355Date d'inscriptionsamedi 30 octobre 2004StatutMembreDernière intervention14 avril 2009 27 nov. 2006 à 00:26
masternico
Messages postés487Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention 1 septembre 2011 26 nov. 2006 à 21:49
Salut, je trouve le code super bien fait.
Par contre, il y a un truc que je ne comprends pas.
Il est écrit $this->db->query(...), or je ne vois nul part la déclaration des fonctions propre à l'objet $db. Est-ce que c'est un objet prédéfini dans php ou est-ce une classe à part que tu as omis de mettre dans ton code. Si c'est le cas, il serait simpas de l'inclure dans le source.
Merci
cs_wizad
Messages postés355Date d'inscriptionsamedi 30 octobre 2004StatutMembreDernière intervention14 avril 2009 3 nov. 2006 à 10:57
l'objet session doit être recrée dans chaque page : en effet lors de la création de l'objet la classe enregistre l'heure de dernier accés pour vérifier si la session est toujours active.
dubaddxx
Messages postés6Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention14 décembre 2006 3 nov. 2006 à 10:33
Merci pour cete classe qui va grandement m'aider dans le developpement de mon site. Mais j'ai cependant une question de newbie: dois je créer un nouvel objet 'Session' dans chaque page pour savoir si l'utilisateur est connecté par exemple ? Ou bien dois je mettre moi même mon objet Session dans la session crée ? => $_SESSION['session'] = new Session(session_id(), $db);
Je n'ai pas les idées très claires sur le sujet, merci de m'apporter un peu de lumière !
Merci
cs_wizad
Messages postés355Date d'inscriptionsamedi 30 octobre 2004StatutMembreDernière intervention14 avril 2009 17 oct. 2006 à 13:27
oups exact je corrige de suite et je retourne à travailler sur les amélioration suggéré par kankrelune.
webdeb
Messages postés488Date d'inscriptionsamedi 5 avril 2003StatutMembreDernière intervention31 mars 20094 17 oct. 2006 à 13:19
Il manque un point virgule à la fin de la première déclaration du premier attribut !
kankrelune
Messages postés1293Date d'inscriptionmardi 9 novembre 2004StatutMembreDernière intervention21 mai 2015 16 oct. 2006 à 13:00
Muarf FhX... tu cherche la petite bète là... tu sais que j'ais pas encore perdu mes habitudes php4 alors t'en profite... lOoOl... t'as pas tort... .. . :oP
@ tchaOo°
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 16 oct. 2006 à 12:32
jparlais pour kankrelune ^^
cs_wizad
Messages postés355Date d'inscriptionsamedi 30 octobre 2004StatutMembreDernière intervention14 avril 2009 15 oct. 2006 à 21:44
euh la désolé mais je te suis absolument pas : du mal avec les commentaires en ce moment.
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 15 oct. 2006 à 17:43
Jvais faire un peu chier mais (:p) :
"// getIp() = méthode qui récupère l'ip (pas juste le $_SERVER['REMOTE_ADDR'])"
$checkKey $this->getIp();
> méthode statique à préférer ici :
$checkKey = self::getIP();
Ce qui fait que getIP() peut être récupéré même en dehord de ta classe, pas besoin de faire 40 méthodes pour chaque classe :)
"// hash() methode qui renvoie un hash sha1 si la fonction
// existe sinon un hash md5
$this->userCheckId = $this->hash($checkKey);
"
Et puis la pareil :)
M'enfin c'est vraiment la ptite bête... juste que jvoulais marquer un truc à la con ;)
kankrelune
Messages postés1293Date d'inscriptionmardi 9 novembre 2004StatutMembreDernière intervention21 mai 2015 12 oct. 2006 à 18:19
bah quelque chose du genre
function getUserCheckId()
{
if(empty($this->userCheckId))
{
// getIp() = méthode qui récupère l'ip (pas juste le $_SERVER['REMOTE_ADDR'])
$checkKey = $this->getIp();
// getEnv = method qui recherche dans les variables $_SERVER, $_ENV
// ou fait getenv() sinon renvoi ''
$checkKey .= $this->getEnv('HTTP_ACCEPT_CHARSET');
$checkKey .= $this->getEnv('HTTP_ACCEPT_ENCODING');
$checkKey .= $this->getEnv('HTTP_ACCEPT_LANGUAGE');
$checkKey .= $this->getEnv('HTTP_USER_AGENT');
// hash() methode qui renvoie un hash sha1 si la fonction
// existe sinon un hash md5
$this->userCheckId = $this->hash($checkKey);
}
return $this->userCheckId;
}
après tu compare à chaque ouverture de session si l'identifiant est mauvais tu ferme la session... .. .
Désavantage certain fournisseur d'accès on des IP dynamiques qui changent tout le X temps... dans ce cas ça posera problème l'internaute sera déconnecté tous les X temps... .. .
Sinon il serait bien que tu te penche sur session_set_save_handler()
cs_wizad
Messages postés355Date d'inscriptionsamedi 30 octobre 2004StatutMembreDernière intervention14 avril 2009 12 oct. 2006 à 17:28
euh petite correction orthographique : J'vais = J'y ai
cs_wizad
Messages postés355Date d'inscriptionsamedi 30 octobre 2004StatutMembreDernière intervention14 avril 2009 12 oct. 2006 à 17:25
Pourrait tu développez ton idée. J'vais déja réfléchi à une telle méthode sans trouver de mise en place satisphaisante.
kankrelune
Messages postés1293Date d'inscriptionmardi 9 novembre 2004StatutMembreDernière intervention21 mai 2015 12 oct. 2006 à 14:13
Pour eviter le session hijacking il serait bien d'ajouter un identifiant unique basé sur l'ip, le navigateur, etc le tout hashé avec md5 pour avoir une clée utilisable et de comparer cette clé à chaque début de page... .. .
@ tchaOo°
cs_wizad
Messages postés355Date d'inscriptionsamedi 30 octobre 2004StatutMembreDernière intervention14 avril 2009 12 oct. 2006 à 08:39
comme quoi personne n'est parfait. Et c'est dans cet objectif que j'ai posté cette source : obtenir des conseils. ;)
Je corrige ça dans la journée.
cs_GRenard
Messages postés1662Date d'inscriptionlundi 16 septembre 2002StatutMembreDernière intervention30 juillet 20081 12 oct. 2006 à 05:36
allez hop on mélange le php4 et php5 en même temps :)
var c'est php4, il faut mettre private, protected ou public avec php5 :)
19 janv. 2010 à 15:42
Par contre une petite question, pourquoi utilise-tu une fonction de cryptage et pas directement la fonction PASSWORD() de MySQL?
Ceci dit, je l'ai laissé comme ca pour ma classe d'abstraction PSQL
Encore merci ! Ca m'a évité pas mal de taf :)
8 janv. 2010 à 14:08
Vu que ces 2 lignes posaient pb :
$username_input = mysql_real_escape_string(traiteVar($username_input, 0));
$password_input = mysql_real_escape_string(traiteVar($password_input, 0));
Je les avais supprimées lors de mes tests.
Pour ceux qui veulent que ca fonctionne rapidement, remplacez-les par :
$username_input = mysql_real_escape_string($username_input);
$password_input = mysql_real_escape_string($password_input);
Mais AMHA il faut aller un peut plus loin dans la protection contre les injections...
7 janv. 2010 à 13:41
Je déterre ce sujet car il m'intéresse au plus haut point. Je suis en fait en train de faire la même chose pour un gros site, et je suis tombé sur cette source.
J'ai plusieurs remarques à faire, notamment au niveau injection SQL.
AMHA, il serait bon de prévoir un sprintf avec un mysql_real_escape_string lorsqu'on interroge la base à partir du POST...
Vous allez dire : l'utilisateur n'a qu'a protéger ce POST avec un addslashes, mais je ne suis pas sur que ce soit aussi propre (mais je peux me tromper ;) )
20 févr. 2008 à 14:05
15 mai 2007 à 12:09
Il serait pratique de mettre à jour ta source et de proposer un fichier ZIP COMPLET avec la class abstraite mysql de malalam ;)
Pour ma part il manque des points-virgules à la fin de tes requêtes de création de table mysql ;)
++ Merci d'avance.
5 févr. 2007 à 00:32
4 févr. 2007 à 20:32
Tous d'abord merci pour ce script
Mais j'ai une Question
Et-il possible de le faire pour Microsft SQL Serveur ?
Merci d'avance
1 janv. 2007 à 16:32
28 déc. 2006 à 18:54
Voila pourquoi elle est à l'extérieur, elle n'a rien à faire dans cette classe.
28 déc. 2006 à 14:34
cf ci-dessous :
public function AuthUser($username_input, $password_input)
{
$this->msg_error = '';
$username_input = mysql_real_escape_string(traiteVar($username_input, 0));
$password_input = mysql_real_escape_string(traiteVar($password_input, 0));
14 déc. 2006 à 21:56
je vais mettre de l'ordre dans ma tête et dans mon code car là je m'y perds aussi :op
14 déc. 2006 à 14:58
(mdr kankrelune)
14 déc. 2006 à 14:07
J'ais du mal à voir ce que tu veux dire... pourquoi veux tu que la connection "pète"... tu lui donne à manger du choux ? lOoOl... .. . ;o)
@ tchaOo°
14 déc. 2006 à 14:00
Tant que je n'ai pas de problèmes de performances, je vais garder le système tel quel en fait.
Lorsque j'aurais plusieurs centaines de connexions simultanées (et là si j'y arrive un jour c'est jackpot!) ça sera une autre histoire ...
Merci pour vos conseils
Ben
14 déc. 2006 à 11:25
@ tchaOo°
13 déc. 2006 à 18:13
Pour le reste de ton post je lit ça tranquillement dés que possible avant de te conseiller.
13 déc. 2006 à 18:06
Donc si je comprends bien, pas question ici de mettre en place un Singleton pour économiser des ressources ?
Toujours dans mon apprentissage de newbie, j'ai défini une classe UserManager avec son constructeur UserManager($db), qui me permet de récupérer la connexion à la base.
un exemple de mon code est
$user_manager new UserManager($db); // le constructeur fait juste un "$this->db $db";
$user_id = $session->GetUserId(); // que j'ai aussi rajouté dans la classe Session
puis enfin je peux manipuler l'objet user_manager:
$user_manager->addProperty($user_id, $property, $value); // INSERT des propriétés dans une table USERPROPERTY
Je ne suis pas forcément convaincu de cette manière de faire, je ne sais pas si je m'y prends bien. (d'autant plus que j'ai plusieurs classes dans le même genre, DVDManager, etc.)
En plus, comme je dois recréer l'objet $user_manager à chaque page ou je fais des opérations sur mes utilisateurs (CreateUser, RemoveUser ...), je pensais transformer ma classe UserManager en singleton, de manière à toujours récupérer la connexion valide.
Quelqu'un voit une autre manière plus élégante de faire, ou bien pourrait me donner son avis sur la chose ?
Merci
Ben
29 nov. 2006 à 23:09
Je m'incline devant une telle oeuvre.
Je manque encore de pratique pour bien en saisir toute la portée, mais c'est superbe. En conjontion avec le présent code, ça donne un truc bien sympa. Merci les gars et encore bravo
10/10 pour ma part
27 nov. 2006 à 00:26
Tout est indiqué...
26 nov. 2006 à 21:49
Par contre, il y a un truc que je ne comprends pas.
Il est écrit $this->db->query(...), or je ne vois nul part la déclaration des fonctions propre à l'objet $db. Est-ce que c'est un objet prédéfini dans php ou est-ce une classe à part que tu as omis de mettre dans ton code. Si c'est le cas, il serait simpas de l'inclure dans le source.
Merci
3 nov. 2006 à 10:57
3 nov. 2006 à 10:33
Je n'ai pas les idées très claires sur le sujet, merci de m'apporter un peu de lumière !
Merci
17 oct. 2006 à 13:27
17 oct. 2006 à 13:19
16 oct. 2006 à 13:00
@ tchaOo°
16 oct. 2006 à 12:32
15 oct. 2006 à 21:44
15 oct. 2006 à 17:43
"// getIp() = méthode qui récupère l'ip (pas juste le $_SERVER['REMOTE_ADDR'])"
$checkKey $this->getIp();
> méthode statique à préférer ici :
$checkKey = self::getIP();
Ce qui fait que getIP() peut être récupéré même en dehord de ta classe, pas besoin de faire 40 méthodes pour chaque classe :)
"// hash() methode qui renvoie un hash sha1 si la fonction
// existe sinon un hash md5
$this->userCheckId = $this->hash($checkKey);
"
Et puis la pareil :)
M'enfin c'est vraiment la ptite bête... juste que jvoulais marquer un truc à la con ;)
12 oct. 2006 à 18:19
function getUserCheckId()
{
if(empty($this->userCheckId))
{
// getIp() = méthode qui récupère l'ip (pas juste le $_SERVER['REMOTE_ADDR'])
$checkKey = $this->getIp();
// getEnv = method qui recherche dans les variables $_SERVER, $_ENV
// ou fait getenv() sinon renvoi ''
$checkKey .= $this->getEnv('HTTP_ACCEPT_CHARSET');
$checkKey .= $this->getEnv('HTTP_ACCEPT_ENCODING');
$checkKey .= $this->getEnv('HTTP_ACCEPT_LANGUAGE');
$checkKey .= $this->getEnv('HTTP_USER_AGENT');
// hash() methode qui renvoie un hash sha1 si la fonction
// existe sinon un hash md5
$this->userCheckId = $this->hash($checkKey);
}
return $this->userCheckId;
}
après tu compare à chaque ouverture de session si l'identifiant est mauvais tu ferme la session... .. .
Désavantage certain fournisseur d'accès on des IP dynamiques qui changent tout le X temps... dans ce cas ça posera problème l'internaute sera déconnecté tous les X temps... .. .
Sinon il serait bien que tu te penche sur session_set_save_handler()
http://fr2.php.net/manual/fr/function.session-set-save-handler.php
@ tchaOo°
12 oct. 2006 à 17:28
12 oct. 2006 à 17:25
12 oct. 2006 à 14:13
@ tchaOo°
12 oct. 2006 à 08:39
Je corrige ça dans la journée.
12 oct. 2006 à 05:36
var c'est php4, il faut mettre private, protected ou public avec php5 :)