CLASSE DE SESSION ET D'AUTHENTIFICATION

cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 - 12 oct. 2006 à 05:36
ceadreak Messages postés 1 Date d'inscription lundi 29 novembre 2010 Statut Membre Dernière intervention 19 janvier 2010 - 19 janv. 2010 à 15:42
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/39893-classe-de-session-et-d-authentification

ceadreak Messages postés 1 Date d'inscription lundi 29 novembre 2010 Statut Membre Dernière intervention 19 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és 24 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 3 janvier 2012
8 janv. 2010 à 14:08
Oups, oubliez le post au dessus;
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...
cs_mdc888 Messages postés 24 Date d'inscription mardi 14 juin 2005 Statut Membre Derniè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és 1 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 20 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és 32 Date d'inscription jeudi 28 décembre 2006 Statut Membre Dernière intervention 20 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és 355 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 14 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és 2 Date d'inscription vendredi 9 septembre 2005 Statut Membre Derniè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és 355 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 14 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és 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
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és 1 Date d'inscription mercredi 27 décembre 2006 Statut Membre Dernière intervention 28 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és 6 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 14 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és 355 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 14 avril 2009
14 déc. 2006 à 14:58
En fait j'arruive pas non plus à suivre ton raisonnemet...

(mdr kankrelune)
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 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és 6 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 14 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és 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 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és 355 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 14 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és 6 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 14 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és 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Derniè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és 355 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 14 avril 2009
27 nov. 2006 à 00:26
Cette classe est prévu pour fonctionner avec un classe d'abstraction de base de données (en l'occurence celle de malalam disponible ici : http://www.phpcs.com/codes/CLASSE-BASE-DONNEES-EX-AVEC-MYSQL-MSSQL-PHP5_35671.aspx

Tout est indiqué...
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Derniè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és 355 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 14 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és 6 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 14 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és 355 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 14 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és 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
17 oct. 2006 à 13:19
Il manque un point virgule à la fin de la première déclaration du premier attribut !
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 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és 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
16 oct. 2006 à 12:32
jparlais pour kankrelune ^^
cs_wizad Messages postés 355 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 14 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és 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
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és 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 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()

http://fr2.php.net/manual/fr/function.session-set-save-handler.php

@ tchaOo°
cs_wizad Messages postés 355 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 14 avril 2009
12 oct. 2006 à 17:28
euh petite correction orthographique : J'vais = J'y ai
cs_wizad Messages postés 355 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 14 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és 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 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és 355 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 14 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és 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
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 :)
Rejoignez-nous