begin process at 2012 02 12 03:32:48
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > CLASSE "REMPLAÇANT" LES SESSIONS PHP (AVEC VÉRIFICATION DE L'ADRESSE IP)

CLASSE "REMPLAÇANT" LES SESSIONS PHP (AVEC VÉRIFICATION DE L'ADRESSE IP)


 Information sur la source

Note :
4 / 10 - par 1 personne
4,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :session, sessions, classe, class, ip Niveau :Débutant Date de création :05/02/2007 Vu / téléchargé :6 852 / 829

Auteur : thomvaill

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (31)
Ajouter un commentaire et/ou une note


 Description

Voici une classe PHP(5) de sessions.
C'est le même principe que les sessions PHP sauf qu'ici, il y a une vérification de l'adresse IP et une clé plus longue pour éviter les "vols" de sessions.
Les sessions sont stockées sous forme de fichiers textes (fichiers .sess) dans un répertoire donné.

La classe gère aussi le "temps de vie" (expiration) des sessions.

Vous pouvez gèrer plusieurs sessions en même temps grâce aux noms de sessions (pareil qu'avec les sessions PHP).

La clé est passée de page en page via les cookies ou par l'URL si ceux-ci ne sont pas acceptés par le navigateur du client.


Le ZIP contient :
- la classe en elle-même (session.class.php)
- un exemple d'utilisation (exemple.php)
- le "session cleaner" (sessioncleaner.php)
- une documentation (session.doc.pdf)

Qu'est-ce que le "session cleaner" ?
   Tout simplement, il peut rester quelques vieux fichiers .sess lors de bugs, de tests, de vieilles sessions qui n'ont pas été correctement "destroy" ou autres ... Ce fichier est à executer régulièrement (via des tâches CRON par exemple). Il va supprimer toutes les vieilles sessions qui ont expiré.

Vous pouvez retrouver plus d'informations sur l'utilisation de la classe dans le fichier session.doc.pdf.


 Conclusion

Bugs / problèmes connus :
- Pour que la détection d'acceptation des cookies par le navigateur client fonctionne correctement, vous devez, avant de faire appel à la classe, envoyer un cookie "cookieAccept" ayant la valeur "true" au client. Si non, la classe va croire que le client n'accèpte pas les cookies.
En effet, pour détecter si le client accèpte ou non les cookies, j'utilise le principe tout simple du "on envoie un cookie et on le lit". Le problème est que, lors de l'envoie du cookie, pour le lire, il faut rafraichir la page...
Pour remédier au problème, il vous suffit de, par exemple sur la page d'accueil de votre site faire :
setcookie('cookieAccept','true',time()+3600*24*3 65);

Points méritants d'être modifiés / optimisés :
- Le système du "sessioncleaner.php"...
En effet, par exemple, si un visiteur va sur une page utilisant la classe et la quitte... La session en cours n'a donc pas pû être destroy(). J'ai donc eu l'idée de faire un script supprimant ce types de sessions (expirées).
Mais bon, ce n'est pas très pratique d'appeler un script régulièrement comme ça. Si vous avez des idées pour optimiser ce point ça m'arrangerai ;)


Bon, je pense que j'ai tout dit, je vous invite maintenant à télécharger le fichier ZIP ;)
Si vous avez des commentaires, idées, n'hésitez pas !

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture INSTALLEUR V1.0 - INSTALLATION/TÉLÉCHARGEMENT AUTOMATIQUE D'...
Source avec Zip ENVOI D'EMAIL DE CONFIRMATION D' AFFICHAGE SUR L'ÉCRAN DU DE...
Source avec Zip PROGRAMME PUBLICITAIRE V1.0
Source avec Zip CRYPTEUR/DÉCRYPTEUR DE TEXTE AVEC MOT DE PASSE À 4 CHIFFRES ...
TUTORIAL SUR LA FONCTION DATE()

 Sources de la même categorie

CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter
Source avec Zip SIMPLETEMPLATE par thunderhunter
Source avec Zip Source avec une capture VOIR QUI VISITE VOTRE SITE par Dariumis
Source avec Zip CLASS SIMPLE CBASEDONNEE par smag42

 Sources en rapport avec celle ci

COMPTEUR DE VISITES SUR FICHIER par pierreSabatier
Source avec Zip CLASSE SQL par benjycorp
Source avec Zip ESPACE MEMBRE SIMPLE V1.0 par Florian54700
Source avec Zip Source avec une capture GÉNÉRATION DE CLASSES D'ACCÈS AUX DONNÉES À PARTIR DES TABLE... par djroulo
GARDER LES PARAMÈTRES D'UNE CLASS À TRAVERS PLUSIEURS PAGES. par massacr

Commentaires et avis

Commentaire de Kdecherf le 05/02/2007 19:24:02

Un système qui peut s'avérer intéressant bien que globalement une reprise des sessions PHP basiques. Pour le système de nettoyage des sessions, une autre possibilité mais qui peut s'avérer très lourde : appel d'une fonction allégée à chaque visite (ou alors ciblage d'une seule page) si tu vois ce que je veux dire :)

Aller, bonne continuation Thomas ^^

Commentaire de thomvaill le 05/02/2007 19:29:57

J'y avais pensé aussi, mais, en effet, ça sera beaucoup trop lourd !

Merci à toi ;)

Commentaire de Kdecherf le 05/02/2007 19:32:25

Au pire, un cron executant le nettoyeur toutes les heures voire même toutes les 24 heures ça ne va pas boucher le serveur ;-)

Commentaire de FhX le 05/02/2007 20:05:37

Y'a quoi d'orienté objet la dedand ?

Commentaire de thomvaill le 05/02/2007 20:12:26

Nan c'est juste une classe, à part ça ... -__-

Commentaire de Kdecherf le 05/02/2007 20:12:51

Arrêtez-moi si je me trompe, mais la POO n'est-il pas la programmation de classes ? Dans ce cas, c'est bel et bien de la POO ...

Commentaire de webdeb le 05/02/2007 20:18:34

Pourquoi vouloir réinventer la roue ?

Commentaire de thomvaill le 05/02/2007 20:26:46

J'ai écrit cette classe dans un soucis de sécurité (vérification de l'IP + clé plus longue).
Pour aussi avoir la possibilité de gérer plusieurs sessions en même temps et la notion de "limite d'expiration".

Mais aussi pour me faire un but, avoir quelque chose à faire :)

Commentaire de Kdecherf le 05/02/2007 20:43:35

Webdeb, tu le dis toi-même, dans un soucis d'innovation on réinvente en se basant sur des fonctions existantes dans le but principal d'améliorer " l'existant ".

Commentaire de FhX le 05/02/2007 21:46:15

Arrêtez-moi si je me trompe, mais la POO n'est-il pas la programmation de classes ? Dans ce cas, c'est bel et bien de la POO ...


==> C'est pas parce que j'ai fais une classe que je fais forcément de l'orienté objet.
L'appèlation "Orienté Objet" ne peut être utilisé que si l'utilisation "Objet" qu'il doit en être faite est utilisé convenablement.

C'est pas parce que je fais :
class x {
public function __construct();
}

$x = new x;
$x->truc();

que je sais faire de l'objet :|


Alors oui, une classe, c'est déja bien pour dire que c'est de l'objet. Mais l'objet, c'est pas ecrire "class machin" et après dire : "j'ai fais une classe".


Oui, mais une classe qui sert à rien, j'appèle plus ca une classe.

Une classe, c'est une représentation abstraite d'un modèle.
Hors, je vois pas l'abstraction ici. Rien qu'avec le passage en paramètre sur les méthodes internes je m'en rend compte.

Parce que la, j'aurais pu faire la même chose avec des fonctions, ca marche pareil et bien mieux :)
Pour etre orienté objet, il va falloir faire un peu mieux :)

Commentaire de webdeb le 05/02/2007 22:14:06

>> Webdeb, tu le dis toi-même, dans un soucis d'innovation on réinvente en se basant sur des fonctions existantes dans le but principal d'améliorer " l'existant ".

Certes mais PHP gère très bien les sessions en natif et surtout très simplement (quoi de plus simple qu'un tableau dans lequel on stocke toutes les données de session ?). Je ne vois pas l'intérêt de recréer un système de sessions dans ce cas là. Je rappelle que l'adresse IP n'est pas un système fiable de reconnaissance d'un internaute...

+1 avec FhX

Commentaire de dominion le 06/02/2007 12:28:38

thomvaill << Qu'entends-tu par vol de session ? En quoi l'allongement de la clef va qugmenter la sécurité ? (bruteforcer la clef native de PHP est déjà suffisament long non ?)
J'avoue que j'ai moi aussi un peu de mal à voir ce que la vérif d'adresses IP vient faire dans les sessions... A part si tu veux vérifier entre chaque page que le visiteur est le même, mais le sessionid est là pour ça non ?

Commentaire de thomvaill le 06/02/2007 12:49:53

Ce n'est pas une question de bruteforcer la clé... C'est pour éviter que quelqu'un trouve l'ID de session de quelqu'un et qu'il le réutilise pour avoir accès à la session de la personne en question (d'où la vérification d'IP).

FhX > excuse-moi, mais on s'en fou carrément de si c'est du POO ou pas... Personnellement j'ai utilisé une classe car c'était plus pratique mais comme tu l'as dit, on aurait pû faire ça avec de simples fonctions.

Commentaire de dominion le 06/02/2007 13:04:11

"C'est pour éviter que quelqu'un trouve l'ID de session de quelqu'un". Faut avoir beaucoup de chance quand même vu la taille du sessid natif (128bits, je pense)... Et la limite d'expiration, tu peux la gérer avec PHP non ? (ou Apache peut-être...)

Cela dit, augmenter la sécurité des sessions n'est pas une tâche inutile, mais je pense que les solutions que tu utilisent vont plus ralentir ton code qu'augmenter cette sécurité...

Commentaire de juki_webmaster le 06/02/2007 13:35:23

La verification sur l'IP.. chez certains fai (internet mobile compris) ils peuvent être plusieurs par proxy, à ce que me disent mes collegues, l'IP des AOL-iens change à chaque socket (possible), sans parler des IP en boites.

La seul chose d'utilise ça serais de changer l'ID de sessions entre chaque page.
Limite.. mais limite.. l'user-agent (a voir).

Commentaire de thomvaill le 06/02/2007 16:01:16

Salut juki :)
En effet il y a les proxies... On pourrait peut être utiliser $_SERVER['X_FORWADED_FOR'] ou autre mais en général les proxies ne divulguent pas la vraie IP...

Changer d'ID entre chaque page pourrait être une solution en effet.

Commentaire de FhX le 06/02/2007 17:24:03

FhX > excuse-moi, mais on s'en fou carrément de si c'est du POO ou pas...

Bah alors t'es mal parti niveau programmation mon gars :)
C'est pas avec des "on s'en fou" qu'on arrive à donner le meilleur de soi-même.
Mais si les conseils que j'ai donné ci-dessus ne t'interesse pas, tant pis pour toi, mais tu coderas toujours aussi salement.

Je suis cru, mais qu'on dise qu'on se tape de ce que je raconte, ca m'énerve pas mal.
Il me semble avoir un assez bon niveau en POO pour pouvoir en parler.


Enfin bref, comme tu veux...

Commentaire de webdeb le 06/02/2007 17:42:14

Tu sais Fhx, il y'en a plein ici qui prétendent savoir programmer en PHP alors qu'ils ne déjà pas les bases du langage. Ce genre de gars qui n'acceptent pas la critique seront ceux qui n'iront pas loin dans le domaine du développement informatique.

Commentaire de thomvaill le 06/02/2007 17:55:54

FhX > Je pense que tu m'as mal compris...
Si j'avais réellement voulu faire du POO, je n'aurai pas fait comme ça. Je t'ai dit que j'avais fait ça sous forme de classe car c'était plus pratique.
Mon but premier n'était pas de faire du POO mais tout simplement de faire un système de sessions.

Après que tu me dises "ce n'est pas du POO", je vais aussi être cru, je m'en tempone vu que ce n'était pas le but!
Si c'est un problème "d'appelation", je vais enlever la source de la catégorie "classes et POO" comme ça tu seras content...

WEBDEB > Ai-je prétendu tout savoir en PHP ? Déjà, c'est impossible ... On apprend tout le temps. De plus, je ne me sens pas du tout concerné par ta critique disant que je n'accèpte pas les critiques.

Commentaire de FhX le 06/02/2007 18:11:43

"Si j'avais réellement voulu faire du POO, je n'aurai pas fait comme ça." Et pourtant tu l'as fait, et ca me chagrine un peu :)

"Je t'ai dit que j'avais fait ça sous forme de classe car c'était plus pratique." Coté pratique ?! Le coté pratique d'une classe n'est pas visible ici, voila pourquoi je m'insurge :p

"Après que tu me dises "ce n'est pas du POO", je vais aussi être cru, je m'en tempone vu que ce n'était pas le but!" C'est bien ce que je dis, ne fait pas de classes si tu ne sais pas t'en servir un minimum :)

Il devrait y avoir un peu plus d'abstraction dans ta classe... c'est ce qu'il manque beaucoup !



Bon, chui peut être devenu un peu puriste avec le temps... faut pas m'en vouloir de trop ^^
Que tu fasses une classe de session, ca ne me gène pas. Y'a juste qu'il faut coordonner ca un peu mieux :)
Y'a juste ca qui me chiffone ^^

Commentaire de thomvaill le 06/02/2007 18:22:14

Que veux-tu dire par "un peu plus d'abstraction" ? (je n'ai jamais appris ce terme, désolé).

Le côté pratique des classes ?
   Exemple :
$infosperso=new session('infosperso');
$auth=new session('auth');

if(isset($auth->vars['mdp']) && $auth->vars['mdp'] == '123456'){
   $infosperso->vars['nom'] == 'Dupond';
}

$infosperso->save();
$auth->destroy();

(Exemple débile qui ne sert à rien...)
Vas faire ça avec de simples fonctions... C'est quand même plus simple avec des classes, non ?

Commentaire de FhX le 06/02/2007 19:15:33

bah je peux :

session_init('session_id');
if ( isset(session_vars('mdp')) && session_vars('mdp') == '123456') {
session_vars('nom') = 'Dupond';
}

session_save();
session_destroy();

Ca marche aussi bien hein :)

Ce que je veux dire, c'est que si j'utilise ton système tel quel dans une autre classe, je fais comment ? Je dois faire passer l'objet en paramètre dans le constructeur ? Je vais me retrouver avec :
public function __construct($objSession) {
$this->session = $objSession;
}

Ce qui signifie que tu vas être obligé d'instancier une première fois ton objet en tout début de page, pour pouvoir le faire passer en paramètre dans autant de classes qui nécessiterons les sessions ? Ouh la :s

Voit du coté du singleton, et aussi du coté de session_set_save_handler() :)

Le binz, c'est ca. C'est le passage de ton objet de session qui ne me convient pas. Car tel quel, ton objet ne me sert à rien dans une autre classe :)

Commentaire de thomvaill le 06/02/2007 19:50:40

Lol oui mais avec ton script tu ne peux pas gérer plusieurs sessions en même temps ;)

Je vais me renseigner au sujet du singleton et du session_set_save_handler(), merci de l'info ;)

Commentaire de kankrelune le 07/02/2007 03:17:09

Moi ce que je ne comprend pas c'est pourquoi tu veux changer le mode de fonctionnement des sessions... pourquoi plusieurs session... quel intérêt... la session est un tableau unique regroupant des information persistantes... point... dans l'exemple que tu donne plus haut quel est l'interet de $auth si ce n'est surcharger ton appli et par la même ton serveur... .. .

Tu voudrais simplement changer la partie gestion et stockage via session_set_save_handler() par exemple en faisant une class d'abstraction fichiers/sgdb ou un truc dans le genre je comprendrais mais là je vois pas l'interet... .. .

@ tchaOo°

Commentaire de kankrelune le 07/02/2007 03:33:22

Qui plus est ton système n'est pas complet... il n'y a pas de garbage collector à proprement parlé... le fichier à part c'est plus que bof bof... .. .

Tu peux faire un système de gestion des sessions expirés en php... appuis toi sur la date de dernière modification du fichier... tu peux déclencher la routine périodiquement via une condition avec un modulo sur une valeur aléatoire ou un rand() (par exemple) tu peux même intégrer un paramètre variable pour gérer la précision de déclenchement le tout via le destructeur de la classe... pas besoin de mobiliser une tâche cron pour faire ça... .. .

@ tchaOo°

Commentaire de TheSin le 07/02/2007 09:39:47

perso, y'a des parties de codes qui me chagrine ..... (je ne veux pas rentrer dans le débat class/POO, système de sessions, etc ...)

Voici une partie de ton code :

private function generateId ($sessionName) {
  while(true){
    // Code volontairement enlevé
    if(!$this->sessionExists($sessionName, $ID)){
    break;
    }
  }
}

Pourquoi ne pas simplement utiliser un do ... while ?

private function generateId ($sessionName) {
  do{
    // Code volontairement enlevé
  }while(!$this->sessionExists($sessionName, $ID));
}

je trouve ca plus logique et plus simple ^^

J'ai pas regardé le reste, mais bon, j'ai pas beaucoup de temps, je suis en cours tout de même.

Commentaire de FhX le 07/02/2007 11:39:27

Même pas :

while ( $this->sessionExists($sessionName, $ID) );

Une ligne, ca suffit quelque fois :)


Mais bon, les sessions, ca reste 1 session par page :) Je vois pas pourquoi en faire plus d'une ^^

Commentaire de TheSin le 07/02/2007 13:09:48

FhX, suivant le code qu'il a, il doit d'abord exécuté le code, sinon il ne casserait pas la boucle après son code non ?
Donc ton while serait mauvais dans le cas présent (j'ai pas tout tout regardé non plus).

Par contre, je suis d'accord, je ne vois pas pourquoi posséder plusieurs sessions par page .... :/

Commentaire de FhX le 07/02/2007 19:14:49

ah ui en effet, j'avais oublié le (// code enlevé :p)

Commentaire de djheart le 16/07/2007 19:21:43

Salut a tous
ça commence 0 dater un peu ce sujet !
Enfin bon je voulais juste laisser une adresse qui me semble intéressante. Je suis trop novice pour participer au débat ou encore même dire que le lien que je le laisse relate de choses bien conçues.

Mais enfin je le laisse quand même : http://php.developpez.com/cours/sessions/?page=plus

Voila soyez pas trop dur avec thomvaill. Il a tenté un truc qu'il pensait être utile et fiable.

"C'est de ces erreurs qu'on apprend..."

Commentaire de Petit bateau le 28/11/2007 19:11:27

Salut,
Je trouve que c'est une très bonne source, cependant pour les sessions, on ne peux pas se fier aux adresses ip, pourquoi ne pas rajouter tout simplement un vérification de l'user agent?

Tu pourrais rajouter 2-3 lignes pour la configuration des sessions par exemple pour la durée.

Et enfin, la durée maximum ne change jamais, je m'explique : tu utilises un $sessionTTL=time()+durée de la session que tu compares à chaque fois, mais si l'utilisateur reste 2h sur le site il devra se reconnecter puisque dans le fichier la durée $sessionTTL du fichier ne change jamais.

Et enfin pourquoi ne ferais tu pas la class avec les sessions de php?

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

pb avec les sessions et cookie [ par nikos283 ] Bonjour,j'ai lu sur plusieurs site que les session enregistraient leur id dans un cookie. L'autre solution est de le passer par l'url.Mon proble est l détruire variable de sessions [ par professeursidi ] Salut,voila dans mon site avec base de données j'utilise les sessions pour garder mes variables mais pti pb :Si je choisi par exemple de consulter un Plus d'info technique sur les sessions ... [ par amosc ] amosSalut tt le monde,J ai une question technique : voila ...Je sais que les cookies s'enregistre chez le client, mais les session ou sont elle enregi sessions [ par eax ] salut!j'utilise les session sur mon site et j'ai mis un truc du genre session_register("blabla");j'aimerais savoir comment récupérer (sous forme de ta Question sur les sessions [ par zzzzzz ] Salut J'aimerai faire un log auto avec les sessions mais on m'a dit que par default les sessions etait limité a 15 minutes. En fait j'aimerai pouvoir sessions [ par miss07 ] Bonjour, je viens de commencer à apprendre PHP et je voudrai savoir si avec une session on peut faire une vérification d'un mot de passe et d'un login sessions [ par fofolle ] J'arrive a avoir mes variables que sur une pagealors que je les commence toutes parsession_start();et je fais gaffe a mes include no sucidecependant l fatal error sur chargement de class [ par fabrice_pi ] salut à tous,j'utilise une classe PHP pour faire mes taleaux en html. depuis peu j'ai l'erreur suivante :Fatal error: Cannot instantiate non-existent Question sur les sessions [ par zzzzzz ] Salutj'aimerai simplement savoir si il est possible d'avoir toutes les variables sessions utilisé par l'enssemble des visiteurs.Par exemple imaginons Question sur sessions [ par must ] Bonjour,des questions sur les sessionsQuand quelqu'un viens sur une page,et q'une session est ouverte,on peut incrementer une variable pour un compteu


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,181 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales