Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: 3 domeny, 1 serwer, wspólne logowanie
Forum PHP.pl > Forum > PHP
sowiq
Witam,
mam do rozwiązania pewien problem, krótko opiszę o co chodzi:

- mam 3 serwisy pod 3 różnymi domenami: s1.pl, s2.pl, s3.pl
- czas zalogowania na różnych serwisach ma być różny (np. 6h, 12h, 1h - dwa serwisy z newsami i jeden aukcyjny)
- wszystkie serwisy stoją na jednym serwerze, na tym samym koncie (nawet pliki silnika są te same, ale to chyba żadna różnica)
- serwisy korzystają z jednej bazy danych, ale pobierają po prostu różne informacje
- system logowania każdego serwisu na sesjach (id sesji w cookies)
- systemy będą do siebie wzajemnie linkowały (np. przekazując w ten sposób id sesji)

Problem: jak zrobić, żeby zalogowanie na jednym z serwisów logowało na pozostałe?
- system sesji PHP zapisuje dane na plikach, czyli teoretycznie przekazanie id sesji w linku załatwiłoby sprawę? Czy istnieje jeszcze podział sesji na domeny? (konto hostingowe jest to samo)
- cookies są niezależne dla każdej domeny, to oczywiste

Mój pomysł:
(np. linkujemy s1 -> s2)
- przekazywanie w linku id sesji
- na s2 robimy session_regenerate_id() (ew. kopiujemy dane zapisane w sesji) i ustawiamy inny czas życia sesji (wymóg) - dzięki temu ustawią się niezależne cookies dla każdego serwisu
- id sesji muszą być zapisane w bazie (taki kolejny wymóg), więc z wylogowaniem ze wszystkich serwisów jednocześnie też nie będzie problemu

Moje pytanie brzmi:
- jak to się ma do bezpieczeństwa?
- czy moje myślenie dąży w dobrą stronę?
- czy w ogóle jest to wykonalne biorąc pod uwagę kwestie zabezpieczeń serwera/przeglądarek?

Z góry dzięki za wszystkie sugestie.
erix
Cytat
Czy istnieje jeszcze podział sesji na domeny? (konto hostingowe jest to samo)
- cookies są niezależne dla każdej domeny, to oczywiste

Sobie odpowiedziałeś. winksmiley.jpg

Cytat
- jak to się ma do bezpieczeństwa?

Hmm, ciężko powiedzieć, gdyż istnieje łatwy sposób na session hijacking.

Cytat
- czy moje myślenie dąży w dobrą stronę?

Zależy, co tak naprawdę chcesz osiągnąć. Proponowałbym token w URL, niezależny od ID sesji.
sowiq
Cytat(erix @ 13.02.2009, 16:54:51 ) *
Zależy, co tak naprawdę chcesz osiągnąć.
Napisałem co chcę osiągnąć. Chcę, aby po zalogowaniu w jednym serwisie i przejściu do drugiego user był zalogowany i tam. Nie byłoby to możliwe, gdyby serwisy były na różnych serwerach, ale u mnie są i to na jednym koncie. Dlatego zastanawiam się, czy sesje też nie będą te same (jedyna różnica to nazwa domeny - te same pliki, ten sam serwer, ten sam właściciel plików i folder domowy).
Cytat(erix @ 13.02.2009, 16:54:51 ) *
Proponowałbym token w URL, niezależny od ID sesji.
To jeszcze lepsze od ID sesji. Jak ktoś przechwyci tokena, to bez niczego będzie zalogowany. A w sesji mam przynajmniej zapisany adres IP zalogowanego usera.
erix
Cytat
Dlatego zastanawiam się, czy sesje też nie będą te same (jedyna różnica to nazwa domeny - te same pliki, ten sam serwer, ten sam właściciel plików i folder domowy).

A nie lepiej byłoby dać wspólne konto, tylko wymaganie zalogowania do każdego z serwisów...? Rozmawiamy przecież i o bezpieczeństwie...

Cytat
To jeszcze lepsze od ID sesji. Jak ktoś przechwyci tokena, to bez niczego będzie zalogowany. A w sesji mam przynajmniej zapisany adres IP zalogowanego usera.

Źle mnie zrozumiałeś. winksmiley.jpg Żeby był zalogowany, token musi najpierw istnieć. Oprócz samego SID-a sprawdzany byłby również i token.
sowiq
Ok, może nie wyraziłem się zbyt jasno. Jak napisałem na początku - baza danych jest wspólna dla każdego serwisu. Wspólna jest tabela z użytkownikami, jest ten sam system logowania (te same pliki!).

Cytat
Żeby był zalogowany, token musi najpierw istnieć.
Sorry, ale najpierw piszesz o session hijacking, a potem wypisujesz takie rzeczy. Czym w takim razie wg. Ciebie taki generowany token będzie się różnił od SID'a?

Cytat
A nie lepiej byłoby dać wspólne konto, tylko wymaganie zalogowania do każdego z serwisów
Jeśli byłoby lepiej, to nie zakładałbym tematu. A konto jest wspólne, co napisałem powyżej.
W pierwszym poście napisałem, że chcę zrobić tak, że po zalogowaniu do jednego serwisu, użytkownik był zalogowany na pozostałych 2. To jest moje pytanie, więc nie pisz mi proszę, że mogę logować usera 3 razy, bo doskonale o tym wiem.
erix
Cytat
Czym w takim razie wg. Ciebie taki generowany token będzie się różnił od SID'a?

Tym, że za każdym żądaniem jest on inny? (może być wykorzystany tylko raz)

Można by to było zrealizować w mniej więcej ten sposób:
Logując się na jednej stronie wstawiasz do bazy token (np. tabela memory z połączonym SID-em). Skrypty logujące do innych domen są wywoływane jak obrazki (AJAX nie wchodzi w rachubę ze względu na ograniczenia).

I teraz sytuacja ma się następująco:

Kod
<img src="http://server1.pl/signin.php?sid=d97h78d87g6b876d&amp;token=873982384" />
<img src="http://server1.pl/signin.php?sid=d97h78d87g6b876d&amp;token=873982384" />

Jeśli token się zgadza, signin.php ustawia ciasteczko, user jest zalogowany. Jeśli się nie zgadza - nie robi nic/generuje inny SID.

Oczywiście, wszystkie domeny korzystają z tej samej tabeli z tokenami, GC zrealizujesz sobie już chyba sam. winksmiley.jpg
sowiq
I to jest bardzo dobra odpowiedź smile.gif Podoba mi się ten pomysł.

Zastanawia mnie jedno tylko. Sesje zapisywane są w jakimś katalogu tmp, najprawdopodobniej jest to inny katalog dla każdego użytkownika serwera (czyli dla każdego konta hostingowego).
Czyli teoretycznie logując się na s1 wystarczyłoby tylko raz ustawić cookie na s2 i s3 o takiej samej nazwie jak nazwa sesji. Dzięki takiemu rozwiązaniu mógłbym 'współdzielić' jedną sesję w ramach 3 różnych domen.
Tylko pytanie czy PHP rozróżnia w jakiej domenie jest ustawiona dana sesja? Czy po prostu w ramach jednego konta hostingowego wszystkie sesje są dostępne pod różnymi domenami?
erix
Cytat
Czyli teoretycznie logując się na s1 wystarczyłoby tylko raz ustawić cookie na s2 i s3 o takiej samej nazwie jak nazwa sesji. Dzięki takiemu rozwiązaniu mógłbym 'współdzielić' jedną sesję w ramach 3 różnych domen.

Tak.

Cytat
Tylko pytanie czy PHP rozróżnia w jakiej domenie jest ustawiona dana sesja? Czy po prostu w ramach jednego konta hostingowego wszystkie sesje są dostępne pod różnymi domenami?

Nie rozróżnia. Jeśli chodzi o drugie pytanie - lepiej ustaw katalog na sesje gdzieś na Twoim koncie, będzie bezpieczniej. winksmiley.jpg
sowiq
Ok, dzięki wielkie za pomoc i zainteresowanie tematem jako jedyna osoba.

Będę raportował o ew. dalszych wątpliwościach i napotkanych problemach.

Pozdrawiam.
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.