Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Konflikty, nadpisywanie i bezpieczenstwo Sesji, Problemy wynikajace z wywolywania sesji wielokrotnie
iwosz
post
Post #1





Grupa: Zarejestrowani
Postów: 62
Pomógł: 3
Dołączył: 30.07.2009

Ostrzeżenie: (0%)
-----


Witam,

na wstepie chcial bym zauwazyc ze piszac nowy temat dreczy mnie mysl ze 'taki temat byl juz 100razy' i zaraz ktos sie do mnie doczepi - to chyba troche chore ze na forum nie mozna sie w spokoju wypowiedziec, z drugiej strony rozumiem moderatorow. W kazdym razie jak pisze to znaczy ze szukalem i nie znalazlem.

Problem:

Powiedzmy ze mamy 2 aplikacje, odpalamy obie, w kazdej z nich inicjowane sa zmienne sesyjne, niektore o takich samych nazwach (np. $SESSION['user_login'], lub cokolwiek innego), juz w trakcie uzytkowania abu aplikacji w tym samym czasie, zauwazylem ze w obu aplikacjach wyswietlajac zmienne sesyjne mamy dokladnie taka sama tablice, z reguly z danymi aplikacji ktora uruchomilismy jako ostatnia, czyli mowiac potocznie wyglada to tak jakby sesja zainicjowana w aplikacji 2 nadpisala sesji w aplikacji 1. Czy to jest mozliwe? W manualu PHP, czesc dot. sesji nie ma takich informacji, lub sa niewystarczajace. Czy jest to zwiazane z ustawieniami w php.ini (plik z danymi sesji) ?

Co ciekawe pomimo wyswietlania w aplikacji 1 zmiennych z aplikacji 2, aplikacja 1 dziala poprawnie (musi korzystac z wlasnych zmiennych). Jesli jest to tylko kwestia wyswietlania ostatnio zarejestrowanych zmiennych, to luz (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Glowny problem:

W wyniku powyzszego problemu, w momencie wylogowania sie z aplikacji 2, rowniez uzytkownik zostaje wylogowany z aplikacji 1... a dokladnie zmienne przechowujace info o logowaniu danego uzytkownika musza byc niszczone. Ciezko mi dokladnie zdiagnozowac problem, wylogowanie polega na zniszczeniu sesji:

  1. <?php
  2. $_SESSION = array();
  3. unset($_SESSION);
  4. ?>


Ustawienia php.ini:
session.cookie_httponly: Onsession.cookie_lifetime: 0session.cookie_path: /session.name: PHPSESSIDsession.use_cookies: Onsession.use_only_cookies: Off" title="Zobacz w manualu PHP" target="_manual

w aplikacji (z koniecznosci) ustawiam naglowki:
  1. <?php
  2. session_cache_limiter ('must-revalidate');
  3. header("must-revalidate");
  4. header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
  5. ?>




Tak to wyglada, testuje na localhoscie, PHP 5.2.9-2, Apache 2.2 pod Windows XP sp3

Pierwszym i najprostrzym chyab rozwiazaniem bylo by w jednej z aplikacji dodanie przedrostka do wszystkich zmiennych sesji w danej aplikacji (np 'ap1-nazwa_zmiennej'). Wtedy nawet jesli obie sesje sie nakladaja, to itak zmienne sie nie nadpisza, pozostaje jednak problem niszczenia sesji... nalezalo by przejrzec sesje i usunac wszystkie zmienne z danym przedrostkiem. Wydaje sie to dosc malo optymalnym rozwiazaniem...

Problem moze sie tez wiazac z blednie wygenerowanym ID sesji (jest on generowany domyslnie, nic nie bylo zmieniane). W momencie wyswietlania nazwy sesji funkcja session_name() w obu aplikacjach wyswietlane jest PHPSESSID. Czytalem o session_regenerate_id() itd. ale nie jestem pewien czy to dobra droga...

Caly czas badam ten problem, wykluczam niektore opcje, podejrzewam jednak ze nie mam wystarczajacej wiedzy na temat Sesji w PHP... dlatego zwracam sie z prosba o zidentyfikowanie problemu, sam caly czas czytam o sesjach i szukam rozwiazania. Jesli ten problem byl juz jednak omawiany wystarczy link do tematu :]


Z gory dziekuje za wszelka pomoc

Pozdrawiam

Ten post edytował iwosz 30.07.2009, 12:11:47
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Sokrates
post
Post #2





Grupa: Zarejestrowani
Postów: 96
Pomógł: 0
Dołączył: 11.09.2006
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


A ja bym zaproponował w każdej aplikacji przed wywołaniem sesji,

wstawić taką linijkę kodu:
  1. ini_set("session.cookie_domain", "nazwa_aplikacji.nazwa_domeny");

np:
W aplikacji 1:
  1. ini_set("session.cookie_domain", "aplikacja_1.domena.pl");

W aplikacji 2:
  1. ini_set("session.cookie_domain", "aplikacja_2.domena.pl");


W ten sposób ciasteczka i sesje będą trzymane w 2 różnych miejscach, będą posiadać też dwa różne 'sessien_id'.
I w momencie usuwania sesji z pierwszej aplikacji wystarczy:
  1. $_SESSION = array();
  2. unset($_SESSION);

nie ruszy to sesji z drugiej aplikacji, i tak samo na odwrót, usunięcie sesji z drugiej aplikacji nie ruszy sesji z pierwszej aplikacji.

Pozdrawiam,


a tak swoją drogą mam odwrotny problem, mam 2 aplikacje i chcę mieć miedzy nimi tą samą sesje loginy i tak dalej.
Niby sesje są zapisywane w jednym miejscu , ale jedna sesja nadpisuje drugą nie czytając jej , tak wiec jak się zaloguje na pierwszej aplikacji i wejdę na druga aplikacje, to nie dość że na tej drugiej cały czas jestem nie zalogowany to na tej pierwszej zostaje wylogowany. (z powodu nadpisania sesji przez tą drugą aplikacje).

Ktoś może zna rozwiązanie tego problemu?
Co jest nie tak, albo co robię źle?

Pozdrawiam.,
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 26.12.2025 - 11:28