Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jakie logowanie najlepiej zrobic?
Forum PHP.pl > Forum > PHP
wozniak
Witam, mam pytanko jakie logowanie najlepiej zrobic? tzn
Jezeli login jest ok i hasło ok to w ciastko wrzucic losowe cyferki i zapisac je np. w bazie i jezeli ciastko i to z bazy bedzie sie zgadzac to pokaze jakies dane dla uzytkownika tak?
Najki
W ciastku powinien być login i hasło, raczej nic więcej. Przy każdym przeładowaniu strony należy wtedy sprawdzić, czy użytkownik o takim loginie istnieje i czy podane jest poprawne hasło, bo użytkownik zawartość ciastka może sobie zmienić w każdej chwili. Jeśli w bazie użytkowników hasła masz kodowane w MD5() to do ciastka wrzuć hasło już zakodowane tym systemem.
php programmer
Zdecydowanie odradzam ciastka,
można bardzo łatwo się gdzieś pomylić,
a to sie nie przeładuje strony, a to setcookie będzie po wysłaniu nagłowka,
zamiast tego lepiej użyć sesje, zmienna $_SESSION zachowuje się bardzo podobnie do zwykłych zmiennych (z tą różnicą, że jest widoczna wszędzie),
operacje przypisania wyglądają podobnie jak dla zwykłej zmiennej, nie trzeba
używać specjalnie funkcji żeby ustawić zmienną (jak to jest w przypadku ciastek)
po za tym masz już id sejsi (nie musisz nic losować)
mike
~php programmer wybacz ale to co napisałeś to głupie argumenty.

Cytat(php programmer @ 2006-02-28 09:04:51)
Zdecydowanie odradzam ciastka,
Dlaczego?

Cytat(php programmer @ 2006-02-28 09:04:51)
można bardzo łatwo się gdzieś pomylić,
Stosowanie sesji nie gwarantuje Ci, że się nie pomylisz. Tak samo możesz się pomylić jak przy cookies

Cytat(php programmer @ 2006-02-28 09:04:51)
a to sie nie przeładuje strony, a to setcookie będzie po wysłaniu nagłowka,
1. A po co Ci przeładowanie strony?
2. "A to się napisze session_start()" po wysłąniu nagłówków tongue.gif Tak samo jak w cookies

Cytat(php programmer @ 2006-02-28 09:04:51)
zamiast tego lepiej użyć sesje, zmienna $_SESSION zachowuje się bardzo podobnie do zwykłych zmiennych (z tą różnicą, że jest widoczna wszędzie),
A co powiesz o zmiennej $_COOKIE :?:

Cytat(php programmer @ 2006-02-28 09:04:51)
operacje przypisania wyglądają podobnie jak dla zwykłej zmiennej, nie trzeba
używać specjalnie funkcji żeby ustawić zmienną (jak to jest w przypadku ciastek)
A tu musisz używać session_start() i session_destroy()

A poza tym nie wiem czy wiesz, ale korzystanie z sesji powoduje ustawianie cookie na komputerze użytkownika. No chyba że ich nie akceptuje, wtedy UID idzie w linkach i łatwo o włam.

Nie mówię, że nie masz racji. Bo to jest subiektywne podejście i ocena.
Ale jak już chcesz coś zargumentować , to podaj jakieś normalne argumenty.
php programmer
Nie chce się tu wykłucać, ale session_start() piszesz tylko raz na początku strony,
bez żadnych argumentów, wręcz mechanicznie,

a przypisanie wartości wymaga tylko:
  1. <?php
  2. $_SESSION['nazwa']='wartosc';
  3. ?>

i już można używać zwyczajnie tej zmiennej dwie linijki niżej

podczas gdy przy cookie masz:
  1. <?php
  2. setcookie('nazwa','wartosc',time()+3600);
  3. ?>

i widzisz tą zmienną dopiero przy kolejnej wizycie, np przeładowaniu strony

na dodatek kiedyś przez pomyłkę napisałem 3600 zamiast time()+3600
(strata czasu na szukanie błedu)

sam zreszta jeszcze nie dawno byłem przciwnikiem sesji, bo skoro opiera się na cookie to po co jej używać, ale teraz po prostu wiem, że przy cookie łatwiej się pomylić, to tak jak by powiedziec, po co komu Windows/Linux jak można bezpośrednio pisac komendy w asemblerze

cookies mają sens jedynie przy długoterminowym przechowywaniu zmiennych
(tydzień, miesiąc, ...)
koskitos
ok, a w sesjach chyba niekonieczne jest przechowywanie hasla? wystarczy nazwa usera?
dla pewnosci pytam
php programmer
Nie trzeba, hasło sprawdza się tylko za pierwszym razem w bazie
a potem tylko ustawiasz w sesji że dany użytkownik jest zalogowany,
(zresztą w przypadku cookie też nie trzeba trzymać hasła)
revyag
Cytat
że przy cookie łatwiej się pomylić,

Kiepski argument, łatwiej się pomylić ? Że wcisnę inną cyfrę na klawiaturze ? To od dzisiaj zaczynam programować tylko myszką snitch.gif

Cytat
to tak jak by powiedziec, po co komu Windows/Linux jak można bezpośrednio pisac komendy w asemblerze

LOL
thumbsupsmileyanim.gif
php programmer
No z tym Linuxem to argument troche przesadzony, ale oddaje co miałem na myśli
mike
Cytat(php programmer @ 2006-02-28 11:18:39)
prostu wiem, że przy cookie łatwiej się pomylić, to tak jak by powiedziec, po co komu Windows/Linux jak można bezpośrednio pisac komendy w asemblerze

A po co słuchać takich głupot skoro można posuchać kogoś kto ma konkretne argumenty.
Już nawet nie mówię o sobie. Ważne żeby nie Ciebie z takimi głupotami na języku tongue.gif
Kuziu
Cytat(php programmer @ 2006-02-28 12:33:47)
Nie trzeba, hasło sprawdza się tylko za pierwszym razem w bazie
a potem tylko ustawiasz w sesji że dany użytkownik jest zalogowany,
(zresztą w przypadku cookie też nie trzeba trzymać hasła)

A to Ciekawe.

I np. komuś chcesz usunąć konto a on ma tylko informację o tym że jest zalogowany i chodzi po stronce mimo ze go już nie ma.

Ktoś komuś wykrada hasło. User wysyła sobie przypomnienie na maila. zmienia hasło a tamten może mu nadal łazić po koncie mimo że ma już nieaktualne hasło bo ma nastawione w cookie Zalogowany.

Bez sensu.

W cookie nalezy trzymać login i hasło zakodowane i sprawdzac przy każdej odsłonie.
php programmer
ok, no to tym bardziej sie ujawnia przewaga sesji,
(zamkniesz okno i juz jesteś automatycznie wylogowany)
nospor
Cytat
(zamkniesz okno i juz jesteś automatycznie wylogowany)
i co z tego? ale koles co ci biega na Twoim hasle nie zamyka okna i nadal ma sesję i nadal jest zalogowany i nadal ci bruździ na koncie do bulu.

zastanow sie zanim coś napiszesz. W koncu posiadasz "wiedzę popartą wieloletnim doświadczeniem". Nie szargaj tak se opini winksmiley.jpg
php programmer
o matko,
no chyba koleś nie będzie trzymał przez miesiąc otwartej przeglądarki,
więcej za prąd zapłaci niż by miał z tego korzyść
nospor
@php programmer jesteś niesamowity smile.gif Musisz być szczęsliwy, bo widze ze wogole nie przejmujesz się opiniami innych winksmiley.jpg

Kolesiowi wystarczy 5 minut by ci nabruździc na twoim koncie.
php programmer
nospor jesteś niekonsekwentny w swoich wypowiedziach,
włamywacz najpierw musi się włamac żeby mieć hasło,
skoro już się włamie, to przecież admin nie musi wcale wiedzieć
że ktoś się włamał, (włamał się na dodatek w nocy spacjalnie jak wszyscy śpią)
i i tak nie zmieni hasła
Kuziu
A co z logowaniem na stałe ?

U mnie na stronie większość osób korzysta z zapamiętywania hasła.
Jak chcą się wylogować to mogą.
A gdy chcę ich usunąć to już najbliższe kliknięcie go wywala z konta.

A tak jak napisał nospor 5 minut wystarcza.

No ale jak chcesz to upieraj się dalej przy swoim nawet jeśli kilka osób mówi Ci to samo.

Pozdro


--- edit ---

To co jak już się włamał to niech sobie siedzi miesiącami na koncie ?
I nie ma siły go wywalić ?

Bezsens

Lub jeszcze inna sytuacja.
Ktoś mi zmienia hasło ... mnie nie wywala i nawet nie wiem że mi zmienił i sobie używam konta przez miesiąc nie wiedzą że ktoś mi zmienił hasło a on z mojego konta może czytać jakieś informacje kierowane tylko do mnie.

A zresztą mówisz że w cookies mozna popełnić błąd z time()+3600 a 3600 a taki błąd że ktoś może komuś na koncie siedzieć Cię nie razi.
Przez to widać że mowisz tylko to co Ci pasuje nie patrząc na opinię innych.
Bo błąd mało ważny powodowany z Twojej winy jakim jest czas życia Cookie jest tak wazny że przekonujesz kogoś do nie korzystania z niego a to że ktoś się włamie na konto jest dla ciebie mało wazne.
nospor
Cytat
nospor jesteś niekonsekwentny w swoich wypowiedziach,
Nie rozumiem.

Spojrz na to globalnie. ale moze akurat admin o tym wie i ma szanse temu zapobiec. W twoim skrypcie nie bedzie mial tej szansy winksmiley.jpg Mowimy tu tez o prawach. Dla danego usera mogą się one w danej chwili zmienic, ze nie moze czegos zrobic. Niesprawdzając tego, skrypt mu na to pozwoli, bo jest zalogowany na starych prawach.
I wiele innych.
Ale juz skonczmy z tym bo nie raz daleś przyklad, że ciebie nie da się przekonać
sobstel
osobiście uważam, że trzymanie w cookies loginu i hasła to nie jest najlepszy pomysł. nie ma przynajmniej większego uzasadnienia dla tego, bowiem w zupełności wystarczy session_id (i wcale nawet nie trzeba do tego używać mechanizmu obsługi sesji wbudowanego w php). oczywiście nie należy trzymać w samych danych sesyjnych informacyji o tym czy user zalogowany oraz jakie ma prawa. trzeba natomiast sprawdzać to przy każdym żądaniu na podstawie user_id trzymanym jako zmienna sessyjna [nie cookie] (user wtedy nie masz szans wykonać czynności do których nie jest uprawniony, także wtedy gdy już po zalogowaniu został usunięty albo zmieniono mu prawa).

ze względów bezpieczeństwa oczywiście najlepiej wyłączyć transparentne przekazywanie session_id w adresie, tj. uzywac tylko cookies (m.in. session.use_only_cookie czy jakos tak)

---
EDIT:

co do logowania na stałe, to tu też nie używałbym loginu i hasła a też jakiś hash np. md5, tylko nie ten sam co session_id. sesson_id ma dotyczyć (jak sama nazwa wskazuje) danej sesji usera.
wozniak
Teraz mnie dopiero zmieszaliscie;)
nickers
Jesli chodzi o bezpieczenstwo. To jesli dobrze zrozumialem, to przy zapisywaniu w cookie tylko czy uzytkownik jest zalogowany, nie trzeba znac nawet hasla smile.gif Wystarczy ustawic sobie recznie w cookie, ze jestem zalogowany jako admin i nie ma mocnych smile.gif

Ja uzywam sesji, bo mysle, ze sa bazpieczniejsze. Ciezej sie wlamac, jesli nie ma sie zakodowanego hasla. Czasem wystarczy blad przegladarki i cookie nie zostanie usuniety i kazdy kto bedzie chcial bedzie mial dostep do konta. W cookie zapisuje tylko, jesli uzytkownik chce byc "zapamietany", ale wtedy tez tylko zakodowane informacje.
sobstel
Cytat
Ja uzywam sesji, bo mysle, ze sa bazpieczniejsze (...)


bezpieczniejsze od czego? mechanizm sesji uzywa cookies! reszty nie bede komentowac...
nickers
Nie wiem, jak na innych serwerach, ale u mnie w cookie przechowywane jest tylko id sesji. Nawet jesli zostanie nie usuniete, to przeciez sesja ma maksymalny czas trwania.

Jesli w cookie zostanie user i haslo to przepadles :/ Nawet jesli zostanie w wersji zakodowanej, to moze dane te moga latwo wpasc w niepowołane ręce. Taka osoba majac tylko zakodowana wersje hasla, moze je sobie ustawic jako cookie i zmienic haslo na inne, czyli przejac kontrole nad kontem.

Chyba nie mowie zle questionmark.gif Jesli tak to prosze mnie poprawic, nie uwazam sie za znawce tematu, to tylko moje przemyslenia.
sobstel
Cytat(nickers @ 2006-02-28 15:28:37)
Nie wiem, jak na innych serwerach, ale u mnie w cookie przechowywane jest tylko id sesji. Nawet jesli zostanie nie usuniete, to przeciez sesja ma maksymalny czas trwania.

Jesli w cookie zostanie user i haslo to przepadles :/ Nawet jesli zostanie w wersji zakodowanej, to moze dane te moga latwo wpasc w niepowołane ręce. Taka osoba majac tylko zakodowana wersje hasla, moze je sobie ustawic jako cookie i zmienic haslo na inne, czyli przejac kontrole nad kontem.

a, sorry, zle zrozumialem twojego wczesniejszego posta. w zupelnosci sie zgadzam, dlatego jestem przeciwny trzymaniu loginu i hasla (nawet zakodowanego) w cookies, zwlaszcza ze nie potrafie znalezc powodu, dla ktorego mialoby byc to lepsze i bezpieczeniejsze od trzymania samego id sesji.
marcini82
Nie zapominajmy o tym, ze przegladarka przy kazdym wywolaniu wysyla do serwera zawartosc cookies, wiec trzymanie tam tak poufnych danych jak hasla, nawet w zakodowanej postaci, nie jest dobrym pomyslem.
Ktos, kto podslucha sobie na snifferze tylko maly fragment sesji uzytkownika, od razu uzyskuje dostep do jego zakodowanego hasla i Bog wie czego jeszcze, co programista raczyl nieopatrznie w cookie umiescic.
nospor
Tak i dlatego hasla w ciasteczkach powinny byc trzymane tylko na życzenie użytkownika, gdy wybierze np. opcję Zapamiętaj mnie (zaloguj automatycznie)
sobstel
Cytat(nospor @ 2006-03-01 08:54:48)
Tak i dlatego hasla w ciasteczkach powinny byc trzymane tylko na życzenie użytkownika, gdy wybierze np. opcję Zapamiętaj mnie (zaloguj automatycznie)

ale dlaczego i po co? powstrzymywałbym się o przesyłania hasła do usera kiedykolwiek. lepiej chyba trzymać jakiś losowo wygenerowany id, który jest sprawdzany przy wejściu na stronę.
nospor
Jak mowilem haslo, mialem na mysli hasha z tego hasla winksmiley.jpg Moje niedomowienie.

@sopel mógłbyś mi wytlumaczyc ten mechanizm. Nie jestem pewien czy dobrze Cię zrozumiałem.
Chodzi ci oto, że generujemy id, zapisujemy w bazie i to samo id do ciastka? POtem tylko porownujemy? A gdy sie koles tak zaloguje to znowu zmieniamy?
wozniak
ok. czyli robie tak:

  1. <?php
  2. // to oczywiscie bedzie z formularza
  3. $login= "login"; 
  4. $haslo= "haslo";
  5.  
  6. $zapytanie = sql("SELECT * FROM ".$prefix."kontrahenci WHERE kontrahenci_login='$login' ");    
  7. while ($rekord = mysql_fetch_array($zapytanie)) 
  8.   {   
  9. $kontrahenci_haslo = $rekord['kontrahenci_haslo'];
  10. if($haslo == kontrahenci_haslo){
  11. setcookie('login', '$login');
  12. setcookie('haslo', '$haslo');
  13. }
  14. }
  15.  
  16. ?>

A pozniej za kazdym razem sprawdzac tak samo tylko login i hasło z cookies?
I oczywiscie w md5() wrzuce haslo tylko jak pozniej wysłac uzytkownikowi hasło ktore jest zakodowane md5()?
Levabul
Cytat(nospor @ 2006-03-01 10:18:53)
Chodzi ci oto, że generujemy id, zapisujemy w bazie i to samo id do ciastka? POtem tylko porownujemy? A gdy sie koles tak zaloguje to znowu zmieniamy?

Jeżeli tak to na identycznej zasadzie działa ta klasa sesji (napisana dawien dawno pod mini serwis tongue.gif)

  1. <?php
  2. define ('SESSION_TIME', 3600);
  3.  
  4. class session {
  5.  
  6. var $session_id;
  7. var $values = array ();
  8. var $insert = 0;
  9.  
  10. function session () {
  11. if (strlen($_COOKIE['session_id']) == 32) {
  12. $this -> session_id = $_COOKIE['session_id'];
  13. setCookie ('session_id', $this ->session_id, time()+ SESSION_TIME);
  14. $query = mysql_query ("SELECT `values` FROM sessions WHERE `id` = '{$this -> session_id}'");
  15. $row = mysql_fetch_array ($query);
  16. $this -> values = unserialize ($row['values']);
  17. }
  18. else {
  19. $this -> session_id = md5 (time ());
  20. setCookie ('session_id', $this -> session_id, time()+ SESSION_TIME);
  21. $this -> insert = 1;
  22. }
  23. }
  24.  
  25. function getValue ($name){
  26. return $this -> values [$name];
  27. }
  28.  
  29. function setValue ($name, $str) {
  30. $this -> values [$name] = $str;
  31. }
  32.  
  33. function sessionClose () {
  34. $values = serialize ($this -> values);
  35. $time = time ();
  36. $maxTime = $time - SESSION_TIME;
  37. if ($this -> insert)
  38. mysql_query ("INSERT INTO `sessions` (`id`, `values`, `time`) VALUES ('{$this -> session_id}', '$values', '$time')");
  39. else
  40. mysql_query ("UPDATE `sessions` SET `values`='$values', `time` = '$time' WHERE `id` = '{$this -> session_id}'");
  41. mysql_query ("DELETE FROM `sessions` WHERE `time` < '$maxTime'");
  42. }
  43.  
  44. }
  45. ?>


Clasa zapisuje dane z sesji do bazy jako zserializowana tablica, a po przejściu na inną stronę i załadowaniu sesji (jeżeli ta istnieje) dane są pobierane z bazy i odserializowane. Bardzo łatwo zrobić za jej pomocą takie logowanie ...
wozniak
Mam teraz taki problem jak mam hasło zapisane md5 i uzytkownik zapomni hasło to jak mam mu je wysłac?jak odkodowac?Chyba nie da sie tak? jedyna mozliwosc to utworzenie nowego i wysłanie.
nospor
Cytat
hasło zapisane md5 i uzytkownik zapomni hasło to jak mam mu je wysłac
Wyslij mu hasha, następny razem będzie pamiętać by nie zapomnieć laugh.gif
a na poważnie
Cytat
jedyna mozliwosc to utworzenie nowego i wysłanie.
Dokładnie smile.gif Dobrze by było, że gdy tylko koleś zaloguje się na to haslo, wyskoczyl mu komuniakt, ze musi je zmienic na swoje.
sobstel
Cytat(nospor @ 2006-03-01 09:18:53)
Nie jestem pewien czy dobrze Cię zrozumiałem. Chodzi ci oto, że generujemy id, zapisujemy w bazie i to samo id do ciastka? POtem tylko porownujemy? A gdy sie koles tak zaloguje to znowu zmieniamy?

dokladnie tak jak napisales. oczywiscie dobrze by bylo tez trzymac identyfikator albo login samego usera albo cokolwiek po czym go zidentyfikujemy (mozna i bez tego, ale musimy dbac zeby id w bazie bylo unikalne). samo id jest tylko zwyklym zabezpieczeniem.

mechanizm jest praktycznie bliznaczy do tego z zapisywaniem do hasla loginu i zhashowanego hasla - mi sie po prostu nie podoba fakt uzywania do tego hasla (nawet zahashowanego).
nospor
To rozwiązanie jest powiedzmy ciut lepsze od trzymania hasha hasla, ale tylko w przypadku gdy za kazdym razem generujemy to id. Ale jak pisalem tylko ciut lepsze i nie wiem gdzie to jest stosowane. Jesli jakiś serwis bardzo chce miec bezpiecznie, to wogole nie udestępni opcji zapamiętywania.
Wadą takiego rozwiązania jest to, że np.:
zapamiętasz się na jednym kompie/przeglądarce. Za jakis czas zapamietasz sie na innym kompie/przegladarce (powiedzmy komp w pracy i w domu). No i jak się zalogujesz spowrotem na pierwszym, to juz nie wejdziesz z automata, bo identyfikator juz bedzie inny. Takie szukanie dziury w całym winksmiley.jpg
wozniak
Zrobiłem takie logowanie:
Logowanie:
  1. <?php
  2. if(isset($login) &&($haslo)){
  3. $query = sql("SELECT kontrahenci_login FROM ".$prefix."kontrahenci WHERE kontrahenci_login='$login'");    
  4. $rekord = mysql_num_rows($query);
  5.  
  6. if($rekord == '1' ){
  7.  
  8. $ip = $_SERVER[ 'REMOTE_ADDR' ];
  9. $_SESSION['login']    = $login;
  10. $_SESSION['haslo']    = $haslo;
  11. $_SESSION['ip']    = $ip;
  12.  
  13. print("Zalogowany jako $login z ip:$ip");
  14. echo '<br /><a href="1.php?pic=dodaj&PHPSESSID='.session_id().'">strona 2</a>';
  15. }
  16. }
  17. ?>

Sprawdzenie czy zalogowany:
  1. <?php
  2.  
  3. if(isset($_SESSION['login'])&& ($_SESSION['haslo'])){
  4. $ipa = $_SERVER[ 'REMOTE_ADDR' ];
  5. $dwa = $_SESSION['ip'];
  6. if($ipa == $dwa){
  7. $login = $_SESSION['login']; $haslo = $_SESSION['haslo'];
  8. $query = sql("SELECT kontrahenci_login FROM ".$prefix."kontrahenci WHERE kontrahenci_login='$login'");    
  9. $rekord = mysql_num_rows($query);
  10.  
  11. if($rekord == '1' ){
  12. print("ok3245");
  13. echo '<br /><a href="1.php?pic=test&PHPSESSID='.session_id().'">strona 2</a>';
  14.  
  15. }
  16. }
  17. }
  18. ?>
Dodałem do sesji IP bo jak ktos by dał link innej osobie to tamta osoba od razy była by zalogowana.
nospor
  1. <?php
  2. $query = sql("SELECT kontrahenci_login FROM ".$prefix."kontrahenci WHERE kontrahenci_login='$login'");    
  3.  
  4. ?>
Logujesz uzytkownika tylko na podstawie loginu. a co z haslem? Widze, ze w ifie sparawdzasz istnienie hasla, ale w zapytaniu juz go olałeś. ciut niebezpiecznie.
wozniak
Zapomniałem dodac;)Ale takie logowanie moze byc?
nospor
moze byc. oczywiscie zalezy jeszcze jak dodasz do tego haslo winksmiley.jpg

w tym miejscu powiem jeszcze, ze jesli to jest zwykly serwisik, bez większego bezpieczenstwa, to jesli koles jest juz zalogowany i ma to w sesji, to w zasadzie nie musisz sprawdzac jeszcze raz w bazie. troche po php programmerze pojechalismy w tej kwestii, ale mowiliśmy tam o serwisach wymagających większego bezpieczenstwa, aczkolwiek jawnie nie powiedziano o tym. jesli php programmer mial na mysli takie proste aplikacje, to faktycznie nie trzeba biegac ciągle do bazy. kwestia podejscia do bezpieczenstwa w danej aplikacji
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.