Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Konflikty, nadpisywanie i bezpieczenstwo Sesji
Forum PHP.pl > Forum > Przedszkole
iwosz
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 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
wookieb
Dziwisz się? Tak działa przecież sesja więc temat naprawdę jest trochę bez sensu.
Wyobraź sobie, że jestes serwerem.
Użytkownik wchodzi na stronę i skrypt prosi cię o utworzenie dla niego sesji o podanym ID
Ty tworzysz sobie pudełeczko, podpisujesz go ID i trzymasz tam jakieś rzeczy.
Przy każdym kolejnym skrypcie który żąda dostępu do sesji dajesz mu dane z tego samego pudełka. Nie tworzysz nowego.
Po to są właśnie sesje i takie jest ich przeznaczenie.
iwosz
hmm, no ok rozumiem, ale np jak odpale aplikacje w innej przegladarce, to nie jestem zalogowany, tylko musze sie zalogowac ponownie (a zgodnie z tym co mowisz mam juz swoje pudeleczko), ogolnie daze do tego aby moc przechowywac zmienna dla obu aplikacji w sesji ale NIEZALEZNIE :]
Fifi209
Cytat(iwosz @ 30.07.2009, 11:31:57 ) *
hmm, no ok rozumiem, ale np jak odpale aplikacje w innej przegladarce, to nie jestem zalogowany, tylko musze sie zalogowac ponownie (a zgodnie z tym co mowisz mam juz swoje pudeleczko), ogolnie daze do tego aby moc przechowywac zmienna dla obu aplikacji w sesji ale NIEZALEZNIE :]


Twój id jest przechowywany najprawdopodobniej w cookie winksmiley.jpg Dlatego w drugiej przeglądarce nie istnieje!
Jeżeli byłbym przechowywany w pasku adresu (wyłącz sobie cookie) i przekopiowałbyś adres - zobaczysz, że sesja działa. (ew. przekopiuj ciasteczko)
wookieb
ID jakim się reprezentujesz jest zapisywane w ciasteczku (najczesciej i najlepiej) a kazda przegladarka ma "swoje" ciasteczka.
iwosz
Cytat(fifi209 @ 30.07.2009, 12:34:19 ) *
Twój id jest przechowywany najprawdopodobniej w cookie winksmiley.jpg Dlatego w drugiej przeglądarce nie istnieje!
Jeżeli byłbym przechowywany w pasku adresu (wyłącz sobie cookie) i przekopiowałbyś adres - zobaczysz, że sesja działa. (ew. przekopiuj ciasteczko)


mhm, rozumiem wiec jakie rozwiazanie tego problemu bylo by najlepsze? Lub jakie sa mozliwosci w takim przypadku? No i oczywiscie jak to sie ma do bezpieczenstwa danych? :]

Czy tak jak pisalem, dodawanie prefiksow do zmiennych danej aplikacji, rozwiazalo by problem?

Moze w jakis sposob mozna wymusic zainicjowanie nowej sesji dla drugiej aplikacji?

btw. dzieki za taks zybka odpowiedz! smile.gif
wookieb
Przekazywanie id ciasteczka w adresie URL (niepolecane) albo najzwyklej w swiecie tworzysz w sesjie dwa klucze
  1. <?php
  2. $_SESSION['aplikacja_1']=dane
  3. $_SESSION['aplikacja_2']=dane
  4. ?>

A to jak rozroznisz aplikacje to juz zalezy od ciebie.
Fifi209
Cytat(iwosz @ 30.07.2009, 11:38:55 ) *
mhm, rozumiem wiec jakie rozwiazanie tego problemu bylo by najlepsze? Lub jakie sa mozliwosci w takim przypadku? No i oczywiscie jak to sie ma do bezpieczenstwa danych? :]

Czy tak jak pisalem, dodawanie prefiksow do zmiennych danej aplikacji, rozwiazalo by problem?

Moze w jakis sposob mozna wymusic zainicjowanie nowej sesji dla drugiej aplikacji?

btw. dzieki za taks zybka odpowiedz! smile.gif


Jeżeli chodzi o bezpieczeństwo, to moim skromnym zdaniem wygląda to tak:
- Gdy masz serwer dla siebie, jedną domenę i sam używasz sesji - wtedy te z php wystarczą.

A w każdym innym przypadku polecam napisanie własnego session handlera w oparciu o bazę danych czy to sqlite czy mysql...

Jeden użytkownik nie może mieć dwóch id, już Ci to kolega pisał. winksmiley.jpg Więc nie można wymusić nic.
iwosz
Cytat(wookieb @ 30.07.2009, 12:42:32 ) *
Przekazywanie id ciasteczka w adresie URL (niepolecane) albo najzwyklej w swiecie tworzysz w sesjie dwa klucze
  1. <?php
  2. $_SESSION['aplikacja_1']=dane
  3. $_SESSION['aplikacja_2']=dane
  4. ?>

A to jak rozroznisz aplikacje to juz zalezy od ciebie.



no wlasnie, tak jak pisalem, to byl pierwszy pomysl jaki mi wpadl do glowy :] (wiaze sie to niestety z przerobieniem wszystkich zmiennych sesyjnych wykorzystywanych w kodzie aplikacj), jest to chyab najprostrzy pomysl, mozna przy wylogowaniu zrobic unset( $_SESSION['aplikacja_1'] )

ale moze ktos ma jeszcze inny sposob? oczywiscie ten jest dobry wookieb dzieki smile.gif
wookieb
Tak jak kolega wyzej napisał. Napisz session_handlera któremu przekazujesz nazwe aplikacje ktorej ma załadować sesje i po klopocie. Najszybsza metoda.
O session_handlerze pisze nawet na php.pl
Sokrates
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.,
iwosz
Cytat(Sokrates @ 14.08.2009, 13:22:42 ) *
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.,


Hmm, to jest chyba mniejszy problem, bo mozesz zawsze sprawdzic:

  1. if( isset( $_SESSION ) ) {
  2. if ( session_is_registered('login') ) { ... }
  3. }


czy np zmienna 'login' istnieje.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.