[PHP multi sessions]

Fermé
Walid - 8 juin 2006 à 22:55
 oiseauxstyle - 18 févr. 2010 à 09:46
Bonjour à tous,

Je développe un site où j'utilise les sessions (session_start()) afin d'authentifier les personnes qui s'y connectent et de gérer des variables de session.


J'étais content de découvrir que quand on ouvre un 2ème navigateur et qu'on pointe de nouveau vers une page où nous sommes déjà authentifié, la session ne se propage pas à la 2ème fenêtre.


Par contre si on fait un clic droit sur n'importe quel lien de la première fenêtre où on est authentifié et qu'on fait "ouvrir dans une nouvelle fenêtre") la session se propage à cette 2ème fenêtre.

Y a t il moyen d'éviter celà?

Merci.

18 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
22 févr. 2007 à 14:23
Argh...
Bon, alors, dernière idée : simuler les sessions :p
Prérequis : il faudrait que tu aies quelque chose pour identifier de façon unique une session. Tu dois pouvoir utiliser session_id(), mais ça peut aussi être un login ou autre. Appelons cet identificateur ID.

Lors de ton premier traitement, tu mets l'objet sérialisé dans un fichier sur ton serveur, avec ID comme nom de fichier.

Lorsque tu veux générer l'image, tu lis le fichier correspondant à ID, le désérialises, et tu en fais ce que tu veux.
Après, tu peux supprimer le fichier en question pour éviter que cela prenne trop de place.
2
virtualsof Messages postés 106 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 17 août 2014 17
18 mars 2009 à 15:32
bonjour,

Super, mais comment est-ce qu'on fait ca svp ?

Merki
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
21 févr. 2007 à 16:47
Bonjour,

Les sessions sont gérées, entre autre, par le navigateur via un cookie de session. C'est donc lui qui "décide" comment faire, et on n'y peut rien.
Par exemple, avec Opéra, vous n'auriez pas ce problème... Mais Firefox et IE gèrent les sessions de façon globale (sauf ouverture d'un nouveau profil sous firefox).
Ce qui est sûr, c'est que du côté du webmestre, il n'y a pas de solution sans détruire la session précédente...

Xavier
1
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
22 févr. 2007 à 12:09
Bon, si les sessions ne passent pas, dernière solution : mets tout ça dans un cookie.
1
fgallnii Messages postés 12 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 6 février 2008
22 févr. 2007 à 12:31
Hoho bien vu !!!! complètement zappé !

Ah voui là ya des chances que ca passe !!
Je te retiens au courant dans l'aprem !

Merci à toi Reivax962 :)
0
fgallnii Messages postés 12 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 6 février 2008
21 févr. 2007 à 15:24
Je rencontre le "même problème" actuellement...

As tu trouvé une parade depuis ?? (même si le post date...)

Merci.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fgallnii Messages postés 12 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 6 février 2008
21 févr. 2007 à 19:04
Ok merci pour ces infos :-)

Alors du coup, j'ai une autre petite question qui ma foi n'est plus tellement en accord avec ce sujet... mais bon...

J'ai entrepris de vouloir sérialiser un objet PHP5 afin de le passer en paramètre à la fenêtre que l'on souhaite ouvrir...
Jusque là j'étais content puisque ca marchait (même si c'étais pas très propre) seulement lorsque mon objet "prends du poids" (voir beaucoup de poids) et bien j'atteins la limite de la taille d'une url (j'récupère d'Apache, une erreur de type : Request-URI Too Large...)

Ma question est donc la suivante : ya t-il moyen de configurer Apache pour forcer la taille max d'une requete Url ?? j'ai chercher avec notre ami Google mais je ne trouve que la cause de cette erreur et en aucun cas de quoi la contourner ; alors est-ce possible ou non ? j'en sais toujours rien ! (sniff)

Pour ceux qui serait à cheval sur la sécurité, je tiens à préciser qu'aucune information personnelle ou confidentielle n'est concernée par l'objet sérialisé...


Sinon j'envisage de passer par un fichier texte mais là ca me gave car dans un environnement multi-utilisateurs c'est loin d'etre tip-top...

Merci d'avance pour vos réponses :-) ou pour toute autre suggestion
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
21 févr. 2007 à 19:13
Alors, deux solutions à mon avis.

1 - Il me semble bien avoir vu ça quelque part, en effet. Fouille ton httpd.conf, si tu lis l'anglais c'est bien commenté et tu derais pouvoir trouver rapidement la ligne qui va bien.

2 - Plus propre, à mon avis, ce serait de faire passer ton objet en POST plutôt qu'en GET. La taille admissible est plus grande.
0
fgallnii Messages postés 12 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 6 février 2008
21 févr. 2007 à 20:08
Merci pour ta réactivité Reivax962 !!!!


Bon, pour la première solution j'vais fouiner du côté de httpd.conf...


Sinon pour la deuxième solution, elle était venue à mon esprit... mais (parce qu'il y a souvent un "mais") est-ce qu'on peut appeler une image générée par PHP avec un POST ??

Je m'explique : ma page de départ permet de paramétrer un rapport en vu de le représenter à la fois sous la forme d'un tableau Html mais aussi d'un histogramme dans une autre fenêtre.

Je souhaite que l'utilisateur puisse générer autant de rapports (donc autant de fenêtres) qu'il souhaite avec différents paramètrages pour chaque rapport. Ceci va lui offrir la possibilité de comparer ces différents rapports visuellement à l'écran ou à l'impression.

Pour chaque fenêtre ouverte, j'ai une "moulinette technique" (pour passer les détails...) qui récupère les données du POST, puis qui à partir de celles-ci, les interprète sous la forme d'un tableau et d'une image (histogramme) appelée avec la balise <img src='./monImageQuePHPgenere.php'/>


Le fichier "monImageQuePHPgenere.php" lui se sert du tableau résumant les valeurs ; or pour des raisons de performances, je souhaite qu'il n'ai pas à refaire le même traitement qu'il a fallu pour le tableau. Donc en fait, une fois le tableau généré dans ma nouvelle fenêtre je souhaite le passer sous la forme d'un objet auprès du fichier :
monImageQuePHPgenere.php

Alors comment peut-on faire un appel avec des données en POST à une balise image dont la source est un fichier PHP ?? Avec la méthode visant à les passer en GET je fait un :
<img src='monImageQuePHPgenere.php?objetTableau=données_sérialisées'/>


Héhé pas évident et encore moins évident que vous compreniez mon ptit charabia... pas facile d'être concis pour ce besion... :s
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011 > fgallnii Messages postés 12 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 6 février 2008
21 févr. 2007 à 20:30
Ah, oui, je vois le problème...
Dans ce cas, je te conseille d'utiliser une session.

Une fois ton calcul fait, tu passes ton tableau en $_SESSION.
Ainsi, en ouvrant l'image, tu pourras le récupérer sans même qu'il n'ait dû passer par le réseau (gain de temps, en plus du reste !)
0
fgallnii Messages postés 12 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 6 février 2008 > fgallnii Messages postés 12 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 6 février 2008
21 févr. 2007 à 21:25
Une fois de plus au taquet... chapot bas cher Reivax962 !!

L'idée des sessions elle la première que j'ai testée. Seulement, j'obtiens un comportement bizarre, puisque d'une fenêtre à l'autre un coups l'objet est retenu en session l'autre pas. Va savoir pourquoi ?!!?

Je pense que c peut-être à cause des différentes fenêtres externes qui pour pouvoir être multiples, ont toutes un nom de cible différent donc peut-être que ma session est valable que pour ma fenêtre de départ (elle où on paramètre les rapports désirés).

Comment ca un nom de cible ?? Eh bien, mon formulaire de départ ne peut pas ouvrir de multiples fenêtres avec une target "blank". Jusque là on est d'accord je pense, donc à la soumission du formulaire de départ, j'appelle une fonction JS qui construit un nom de fenêtre unique, puis qui l'attribut au target du formulaire et le soumet : ce qui ouvre une fenêtre différente avec les données postées afin d'obtenir tableau + graph. Cela me permet d'avoir mes multiples fenêtres.

C'est ça qui je pense fout la pagaille dans ma session. Comme si la session se mélanger les pinceaux d'une fenêtre à l'autre (or théoriquement ca devrait être la même).

Je sais pas ce que t'en penses Reivax962 ?? (pour bien faire faudrait que je me motives à faire un schéma... j'avoue qu'à cette heure j'ai un peu la flemme)
0
fgallnii Messages postés 12 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 6 février 2008 > fgallnii Messages postés 12 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 6 février 2008
22 févr. 2007 à 12:03
Je viens de fouiller dans le httpd.conf pour trouver une éventuelle directive qui permet de régler le problème du URI-REQUEST TOO LARGE.
Rien de chez rien !! (snifff)

Par contre, j 'ai fouillé d'avantage sur Google et j'ai trouvé comment le faire. En fait, il faut modifier les binaires d'Apache puis refaire un make !

Cela pourrait marcher mais je pense que ca ne ferai que repousser le problème puisque si je met une nouvelle limite, peut-être que dans 6 mois elle sera atteinte donc de nouveau je serai embêté...

Conclusion : j'suis toujours bloqué !! d'autant plus que j'ai cherché pour passer le POST sur une image PHP : impossible !! et j'ai toujours ma session d'une fenêtre à l'autre qui merdouille !! peut-être que la mise en place d'un sémaphore me sortirai de cette m.... !!
0
fgallnii Messages postés 12 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 6 février 2008
22 févr. 2007 à 14:11
Bon je viens tester avec les cookies ! ca marche à merveille héhé !!

MAIS ya encore un problème... lol beh c'est que j'atteinds très vite la taille maximale d'un cookie (4Ko) une fois mon objet sérialisé. Pas de peau !

J'crois que la solution finale va être d'effectuer deux fois le traitement tanpis pour les performances. J'avoue que ca m'embete quand même beaucoup puisque d'un traitement d'environ 7secondes ca me fait passer à un traitement de 14secondes !!! c'est quand même pas négligeable (et ça, c'est seulement pour 6 mois de données donc j'vous laisse imaginer pour un rapport sur une année...)

Je laisse le sujet ouvert si toutefois vous avez encore des idées...
0
fgallnii Messages postés 12 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 6 février 2008
22 févr. 2007 à 14:30
Encore une bonne idée !!

Ouhaip beh j'vais tenter cette tit'technique, mais c'est clair qu'il n'y a pas de raison que ca ne passe pas...

J'envisage de faire un fichier unique temporaire pour le coups. Sais-tu quand est-ce que PHP fais le ménage des fichiers temporaires ?? (Comme ca je n'ai pas à le faire, et j'évite les chances d'écrasements de données dans le cas où l'utilisateur demande 'n' rapports au même instant 't')
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
22 févr. 2007 à 14:34
Aucune idée, je ne savais pas que php savait gérer des fichiers temporaires ^^'

Sinon, pour le problème du nom de fichier, tu peux générer une chaine de 16 ou 32 caractères au hasard, et ne passer que celle-ci en session pour avoir un ID unique sur chaque fichier, même si l'utilisateur lance 5 calculs en même temps.
0
fgallnii Messages postés 12 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 6 février 2008
22 févr. 2007 à 14:41
Ouhaip c'est une bonne idée aussi pour la chaine de caractères aléatoire.

Sinon je me suis renseigné pour les fichiers temporaires... ils se font à l'aide de la fonction tmpfile() dès lors tu peux écrire, lire dedans à volonté et dès que tu les fermes avec "fclose()" PHP fait le ménage de suite...

J'explore cette voie, et te tiens informé,

Encore Merci :)
0
fgallnii Messages postés 12 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 6 février 2008
22 févr. 2007 à 14:57
ME REVOILA !!! héhé !!! et ce coups ci, ya que du bon !!!

Alors alors par où je commence ??
Bon beh j'ai suivi une fois de plus tes conseils Reivax962 à un ptit détail près, je m'explique :

Vu que j'ouvre chaque fenêtre avec un identifiant unique et bien je crée un fichier par fenêtre pour stocker les données puis après lecture pour le graphique je le supprime aussitôt. De ce fait, aucune chance qu'il soit écrasé ou qu'une autre fenêtre vienne écrire ou lire dedans.
J'ai actualisé plusieurs fois chaque fenêtre, elles recréent toute un fichier puis le supprime avant affichage, donc c'est formidable.

Quand je vois aujourd'hui où on en ai arrivé pour cette tit'bidouille (beh voui parce que faut être honnête c'est pas ce qu'il ya de plus propre mais au moins ca marche) eh bien je dis un grand merci à Reivax962 !!!

Où est-ce qu'on peut voter pour Reivax962 ?!!??? hein ? parce que là ca vaut un +10 à tout point de vue (réactivité, pertinence, ...)

Je reviendrai clore le sujet dans la journée, si toutefois d'autres idées arrivent.

Encore merci Reivax962 !! :)
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
22 févr. 2007 à 15:00
Youpi, on y est arrivé :)
Bien joué :)
0
fgallnii Messages postés 12 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 6 février 2008
23 févr. 2007 à 16:51
Yip yop !

Tit'question comment est-ce qu'on marque le sujet comme résolu ?? :s

Merki ;)
0
En passant par une base de donnée ça aurait aussi marcher ^^

-LaNceLoT-
0
silfaxu Messages postés 102 Date d'inscription jeudi 18 décembre 2003 Statut Contributeur Dernière intervention 6 février 2008 11
6 févr. 2008 à 16:40
Salut,

Ok le sujet est pas récent :-) mais bon pour le problème suivant :
"Je viens de fouiller dans le httpd.conf pour trouver une éventuelle directive qui permet de régler le problème du URI-REQUEST TOO LARGE.
Rien de chez rien !! (snifff) ", il faut peut-être jeter un coup d'oeil du côté de la directive :
LimitRequestBody Directive
This directive specifies the number of bytes from 0 (meaning unlimited) to 2147483647 (2GB) that are allowed in a request body.
cf: http://httpd.apache.org/docs/2.0/mod/core.html#limitrequestbody

@+

Sfx
0
fgallnii Messages postés 12 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 6 février 2008
6 févr. 2008 à 16:57
Salut,

Ca a l'air plutôt intéressant et c'est vrai que je n'avais pas vu ce détail de conf.
Je ne suis plus dans le même contexte qu'à l'époque et malheureusement je ne vais pas pouvoir tester...

Merci en tout cas pour ta contribution !

@pluche :-)
0
phenX Messages postés 704 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 28 août 2012 23
13 janv. 2010 à 14:02
pour revenir sur ce problème de multisession...et en passant la viriable d'identification dans l'url, est-ceque ca ne résoud pas le problème N?
0
phenX attention il faut préciser qu'avec ta méthode n'importe qui peut quand tu es connecté durant ta connexion en plaçant à la fin de url la bonne variable il se retrouve directe sur ton compte mais ton idée et bonne j'ai commençé comme ça et je l'ai couplé à ce qui suit.

//voila ce que j'ai pondu dans mon super petit cerveau les ip sont la solution.car iP source ne change jamais normalement que du bonheur.
//et le multisession avec la méthode get ne pose plus de problème avec cette méthode on est tranquille en théorie et si ma théorie n'a pas de faille (l'espoir fait vivre;)).

$chaine=$_SERVER['REMOTE_ADDR'];
$varchar=$_SERVER['HTTP_USER_AGENT'];//garantie que l'utilisateur ne s'amuse pas à gérer deux fois la même session avec 2 navigateur différent à un même instant
$chaine=ereg_replace("[^0-9]","",$chaine);
$varchar=ereg_replace("[^aA-zZ]","",$varchar);
$chaine="superchichon".$varchar.$chaine;//dans mes test sans varchar fonctionne aussi bien mais théoriquement il est nécessaire donc je le laisse.
session_name($_SERVER['REMOTE_PORT']);//port change tout le temps et à l'instant ou il est générer il est unique et change tout le temps donc évite le cas ou 2 personne d'un même sous réseau on accés à un serveur en externe et donc même session id peu donner naissance à des soucies
session_id ("superchichon".$chaine.$_GET['user']);//.$_GET peut être utilisé mais je précise lire plus bas le ATTENTION.
session_start();

même si quelqu'un met en place sont propre serveur web avec sont propre formulaire pour initier les variable comme il se doit et générer une redirection sur votre serveur celle ci ne devrez pas aboutir d'après mes tests, de même avec quelqu'un qui piraterai votre point d'accès pour avoir votre ip il ne devrait pas aboutir j'ai essayer de trouver un truc simple et générique.
ATTENTION METHODE VALABLE a condition de checker à chaque clic les variable d'identification car si l'utilisateur s'amuse à changer son nom d'utilisateur dans l'url il passera d'un compte à un autre comme bon lui semble(quand la menace c'est votre camarade de travail mais ou s'arrête l'infamie et l'horreur de la suspicion).

Sous cette forme des personnes peuvent avoir accès à la même session sans se géner.
oiseaustyle vous lache une petite blague
une Hecker non je préfére un double décimétre blague à Vincentim que mes poto comprendrons
0
personnellement je n'utilise pas le $_GET[''] car trop de gens m'ont dit que le passage de valeur en get pour l'authentification était trop aisément piratable, j'utilise donc cette méthode sans $_GET donc en monosession.
donc plusieur personne ont accés à des comptes sans ce géner et même au même compte pour ceux qui partage leur compte sur les webinterfaces que j'ai bidouiller mais une personne ne peut sur un poste avoir accès qu'à un compte elle doit le fermer ou utiliser un deuxième navigateur genre firefox et opera pour avoir deux compte d'ouvert en même temps.

si quelqu'un test ce que j'ai pondu en multisession j'aimerais bien avoir des échos je repasserai à l'occasion.
chao
0
oiseaustylesombreiris
17 févr. 2010 à 11:53
mon poto rénato a tester voici ce qu'il m'a dit :
Pour compléter il faudrait un test à chaque clic liée à une base de donnée ou par gestion de fichier qui récupére le session_id:user:timestamp:portip
le timestamp:portip serait garder en variable de session[''] pour comparaison si une personne essaye de passer sur un autre compte en changeant url$get il y a test du session_id:user:timestamp:portip avec le fichier celui-ci n'étant pas répertorier
il y a expulsion de l'individus malvaillant.
il faut ajouter une expulsion automatique des individus qui n'utilise pas leur compte durant un certains temps de manière à éviter la surcharge du fichier ou de la table sql qui gére les sessions session_id:user:timestamp:portip car si une personne s'amusse constament à changer le nom en hyperlien elle finirait par surchagé cette table.
shéduler un script qui s'en charge.(tout ça pour éviter la menace qui vient de l'intérieur un camarade de travail mauvais jusqu'à la racine ou si vous voulez pas vous embêtez contenter vous d'une monosession )
merci à mon poto rénato d'avoir tester. chao
0
oiseauxstyle > oiseaustylesombreiris
18 févr. 2010 à 09:46
--------------------------
Pour finir j'ai finalement tester en multisession sans le truc de rénato ça marche très bien. le truc de rénato n'a qu'une utilité c de limité la session dans le temps si on reste inactif le but étant d'éviter les problème du genre quelqu'un oublie d'éteindre sa machine
comme d'habitude la personne ferme juste l'onglet sans avoir cliquer sur "déconnexion" donc la session est encore active est donc quelqu'un qui utiliserais votre poste serait en mesure de modifier vos donnée en accédant à votre compte juste en consultant l'historique.
en somme le truc de rénato n'est pas indispensable si les gens pense bien à cliquer sur quitter pour femer la session.
(concernant l'histoir de l'hyperlien quand vous modifier l'url en y mettant un autre user ça bloque vous n'avez pas la possibilité de passer sur tout les comptes donc tout est ok sans le truc de rénato)
moi finalement je l'utilise sans le truc de rénato car bien des gens utilise le gestionnaire de clée de leur navigateur en somme si la personne oublie d'éteindre ou de vérouillé son poste
n'importe qui qui passe par là à accès à n'importe qu'elle webinterface donc je ne me suis pas fatigué à limité les compte dans le temps un choix personnel de faignant.
un au revoir définitif et j'espère que le code vous servira.
0