Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: COOKIES i SESJE
Forum PHP.pl > Forum > PHP
danwal
Witam,

Od wczoraj dość intensywnie czytam na temat cookie i sesji i chciałbym przejść do implementacji tego ale mam jeszcze jedno zasadnicze pytanie...czy po sprawdzeniu, czy użytkownik posiada ciastko na swojej jednostce mogę przypisać zmienne z bazy do zmiennych sesyjnych, np.

  1. if (isset($_COOKIE['r_user'])) {
  2. $_SESSION['_idclient_'] = 892;
  3. $_SESSION['_idsite_user_'] = 906;
  4. $_SESSION['_login_'] = 'test123';
  5. $_SESSION['_pass_'] = 'test123';
  6. $_SESSION['_host_'] = getenv("REMOTE_ADDR");
  7. $_SESSION['_lang_'] = 'pl';
  8. $_SESSION['_comm_'] = 1;
  9. $_SESSION['_comm_all_'] = 1;
  10. }


Czy jest to złe podejście? Chodzi mi głównie o zrealizowanie "rememberMe" w serwisie...

Napewno spełnia ono zadaną funkcjonalność jednak nie jestem pewien co do poprawności tego rozwiązania bo czy można w taki sposób łączyć cookie i sesje, a bardziej za pośrednictwem cookie ustawiać zmienne sesyjne? Jeśli faktycznie się mylę to czy mógłby mnie ktoś nakierować na właściwy tok myślenia jak za pośrednictwem cookie zapamiętać zalogowanego użytkownika na wszystkich podstonach serwisu, bo szczerze to bez pomocy tablicy $_SESSION nie bardzo wiem jak to rozwiązać...
IceManSpy
Wszystko jest ok tylko:
1. Nie trzymaj hasła w sesji - po co?
2. Trzymaj tam najważniejsze rzeczy - id usera , login i/lub mail chyba wystarczy...
3. Oprócz sprawdzania czy jest dane ciastko, sprawdzaj czy ma pożądaną wartość. BO jakbym teraz utworzył u siebie na kompie ciastko o nazwie r_user to wtedy zacznie mi przypisywać do zmiennych sesyjnych nieznane wartości. Zrób dodatkowo warunek, że $_COOKIE['r_user']) == 'zalogowany'
4. A tak w ogóle po co robić ciastko dla sesji? Ono się automatycznie robi na komputerze użytkownika, więc wystarczy sprawdzać czy np $_SESSION['zalogowany'] ma wartość np true, którą przypisujesz po poprawnym zalogowaniu się.
melkorm
Cytat
Wszystko jest ok tylko:
1. Nie trzymaj hasła w sesji - po co?
2. Trzymaj tam najważniejsze rzeczy - id usera , login i/lub mail chyba wystarczy...
3. Oprócz sprawdzania czy jest dane ciastko, sprawdzaj czy ma pożądaną wartość. BO jakbym teraz utworzył u siebie na kompie ciastko o nazwie r_user to wtedy zacznie mi przypisywać do zmiennych sesyjnych nieznane wartości. Zrób dodatkowo warunek, że $_COOKIE['r_user']) == 'zalogowany'
4. A tak w ogóle po co robić ciastko dla sesji? Ono się automatycznie robi na komputerze użytkownika, więc wystarczy sprawdzać czy np $_SESSION['zalogowany'] ma wartość np true, którą przypisujesz po poprawnym zalogowaniu się.


2. W końcu trafię na istniejącą parę id_user / login / mail
3 / 4. Chodzi tutaj o to gdy już NIE ma sesji

Ogólnie wystarczy że w ciachu zrobisz sobie np:
id_user'a / hash
gdzie hash to np. md5 z id + loginu + maila + sól - ogólnie z danych user'a by zweryfikować go najlepiej jakieś unikalne dane dla użytkownika typu mail / data rejestracji itp wink.gif
danwal
Po pierwsze dzięki wielkie, a co do Twojej listy błędów:

2.,3. -> tak wiem. Przykład, który zamieściłem chciałem ograniczyć do mimimum ale skoro wspomniałeś to spytam co byś polecił umieszczać w tym cookie, bo już z milion wersji przeczytałem i reasumując wyszło, że obojętnie co by to nie było to bezpieczeństwo gwarantuje...ŻADNE (oczywiście mam na myśli ustawienie unikalnej wartości np. temp procesora zarówno w cookie jak i w bazie kojarząc ją z danym userem). Dodatkowo chciałem dodać jeszcze kolumnę BROWSER w bazie sprawdzającą przeglądarkę i jeśli wizyta byłaby z nie tej co wcześniej to przekierowywałoby do strony logowania mimo ustawionego ciastka (ma to sens czy raczej zaniechać?)

4. Ok ale jak w takim ciastku ustawić czas trwania np. na 14 dni?Bo do tego zmierzam...
melkorm
Jako przykład może posłużyć system ciastek z SMF forum, zapisuje on w bazie hasło usera w postaci sha1 i w dodatku dla każdego user'a generuje unikalną sól i wtedy hash w ciastku wygląda następująco:
  1. sha1( password + unikalna_sól );


Dość popularne jest to forum więc sądzę że jakość tego rozwiązania jest całkiem dobra wink.gif

Cytat
4. Ok ale jak w takim ciastku ustawić czas trwania np. na 14 dni?Bo do tego zmierzam...

Trzeci parametr funkcji setcookie. - lub zapisywać czas w bazie, rozwiązań jest wiele.
IceManSpy
Cytat(melkorm @ 26.06.2011, 11:28:38 ) *
2. W końcu trafię na istniejącą parę id_user / login / mail
3 / 4. Chodzi tutaj o to gdy już NIE ma sesji


2. Nie trafisz, jeśli dobrze będzie zrobione logowanie. To ono się zajmie, czy są 2 takie same maile / id. Jeśli będą, tzn że źle jest zaprojektowany system rejestracji użytkowników.
3 / 4. 4 -> Faktycznie, przegapiłem słowo-klucz rememberMe smile.gif Więc z tego się wycofam smile.gif
melkorm
Cytat
2. Nie trafisz, jeśli dobrze będzie zrobione logowanie. To ono się zajmie, czy są 2 takie same maile / id. Jeśli będą, tzn że źle jest zaprojektowany system rejestracji użytkowników.

Nie rozumiesz, znajdę INNĄ parę id użytkownika i jego mail'a - co jest o wiele bardziej prawdopodobne niż trafienie hash'a by zalogować się na innego user'a.
danwal
Hmmm...panowie to takie jeszcze jedno pytanie co do zawartości ciastka...celem unknięcia nowej kolumny w tabelii z użytkownikami nie byłoby lepszym rozwiązaniem np. umieszczanie wartości hash z bazy (w bazie oprócz prawidłowego hasła mam też jego odpowiednik hash), czyli mniej więcej coś takiego:

  1. //wcześniej wykonywane jest zapytanie pobierające info użytkownika
  2. function rememberMe($id,$pass_hash) {
  3. setcookie('_c_u','uid='.$id.'&hash'.$pass_hash,time()+360,'/','.test.dev');
  4. }
melkorm
Nie, ale hash możesz generować z kilku wartości usera np : hasło + mail + login wink.gif id masz więc tylko porównać czy ten hash z ciacha jest równy temu który generujesz dla user'a z jego danych - żadnych nowych kolumn.

PS. Trzymasz czyste hasło użytkownika w bazie ?
PS2. Skorzystaj z serialize, łatwiej Tobie będzie.
danwal
Kurczę bo cyba jednej rzeczy nie rozumiem...

Ok, generuje hash z danych które napisałeś czyli mail, pass, login, id, etc. i zapisuje go do ciastka. Muszę w takim wypadku też gdzieś zapisać kopię tego hashowania bo jeśli dobrze pamiętam to ciężko o taki sam wynik haszowania...czy mój tok rozumowania jest zły? Wygląda on mniej więcej tak:

Użytkownik wchodzi na stronę główną serwisu...tam w index.php jest sprawdzane czy ma ciasto, jeśli ma to jest sprawdzanie czy wartość danych z ciastka zgadza się z danymi (no właśnie?jakimi?jeśli zrobie hash taki o jakim wspomniałeś i go nigdzie nie zapiszę?), następnie jeśli jest ciaskto i porównanie danych jest pozytywne to dane są przypisywane do zmiennych sesyjnych i user bez kolejnej prośby o logowanie może poruszać się po serwisie, jeśli user kliknie wyloguj ciastko jest usuwane.
drozdii07
Hash możesz zapisać w bazie wink.gif Wystarczy dodatkowa kolumna..
melkorm
Cytat
Ok, generuje hash z danych które napisałeś czyli mail, pass, login, id, etc. i zapisuje go do ciastka. Muszę w takim wypadku też gdzieś zapisać kopię tego hashowania bo jeśli dobrze pamiętam to ciężko o taki sam wynik haszowania...czy mój tok rozumowania jest zły?


Hash wygenerowany z tych samych danych daje ten sam wynik - przy sha1, md5 - są też algorytmy generujące różne hashe dla tych samych danych ale to już inna bajka.
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.