ďťż
Podstrony
|
telcocafeTemat otwarty ze względu na to, byście napisali, dlaczego akurat ten sposób jest lepszy...Hmm... ja zrobiłbym to w cookiesach. Można by wtedy było dać opcję automatycznego logowania przy każdej wizycie i zdaje mi się że będzie to też łatwiejsze rozwiązanie do wykonania (przynajmniej dla mnie) ;) Hmm... ja zrobiłbym to w cookiesach. Można by wtedy było dać opcję automatycznego logowania przy każdej wizycie i zdaje mi się że będzie to też łatwiejsze rozwiązanie do wykonania (przynajmniej dla mnie) ;) Co wtedy, jeśli serwer nie obsługuje sesji? Pozostaje zrobić użytkownikowi do wyboru - z resztą to nie tak dużo... wg. mnie to w cookies gdyz jest to wygodniejsze i latwiejsze rozwiazanie wg mnie oba rozwiązania. normalnie używasz sesji. jeżeli user zaznaczy coś w stylu "Zapamiętaj mnie" używasz cookies. Użytkownik ARJ edytował ten post 29 kwiecień 2005, 18:42 Powracam do tematu. Jednak wybiorę samo cookies (nawet gdybym użył sesji, także musiałbym w cookies przechowywać wpisane dane - login i hasło MD5 w przypadku zapamiętywania użytkownika). Przesłanie loginu i zaszyfrowanego MD5 hasła z cookies nie powinno trwać długo. PHP-Fusion także korzysta z cookies. To jednak łatwiejsze rozwiązanie. a jeżeli user ma zablokowane przyjmowanie cookies? Chyba, że zrobić własną obsługę sesji. Jest o tym artykuł na webcity.pl Mozna wtedy się uniezależnic od przesłodzonych ciasteczek i standardowych sesji. Zalety: prawie same ;) a jeżeli user ma zablokowane przyjmowanie cookies? No tak, ale prawdopodobieństwo, że ktoś wpisze ID, które znajduje się akurat w bazie, w niewygaśniętych sesjach jest bardzo znikome. To też oczywiście zależy od tego co przyjmiemy za ID sesji, bo równie dobrze może to być jakiś ciąg kilkudziesięciu znaków, jak i zwykła liczba. co do cookies to uwzględnij że ktoś a) przechwyci cookie użytkownika B) korzystając z błędów w CMSie przechwyci hash md5 hasła użytkownia => Podrobienie cookie, np. admina. Z dodatkowych zabezpieczeń: - zapisz w bazie przy logowaniu IP z jakiego nastąpiło i uznawaj cookie tylko dla tego IP :) - zakryptuj całe cookie jakąś klasą kryptującą (co potrafi odkodować a kodowanie prowadzone jest poprzez klucz - łańcuch podany gdzieś w configu strony) ferrari -> jeżeli aż tak Cię martwi niewylogowanie to zrób takżeby musiało się wylogować. po 10 minutach bezczynności wywal go z sesji. zaszyfruj to wszystko przy użyciu SSL 3.0 i nie ma problema. Do tego dodaj kod w stronie że przy zamykaniu okna bez ywlogowania autopmatycznie się wyloguje. Jeszcze jakies zastrzeżenia? Jeśli użytkownik jest zapamiętywany, i tak dane muszą być w cookies (hasło będzie zakodowane MD5 albo hash (lub algorytm base64), loginu raczej nie trzeba kodować). Logowanie bez pamiętania danych mogę oprzeć na sesjach. Jest tu jeden problem - session_register()... Da się to jakoś zrobić, by pasowało dla konfiguracji z register globals on i register globals off? Indetyfikator dopisywany byłby do adresu. Co myślicie o logowaniu: <?php  if (!isset($_SERVER['PHP_AUTH_USER'])) {   header('WWW-Authenticate: Basic realm="My Realm"');   header('HTTP/1.0 401 Unauthorized');   echo 'Tekst do wysłania, jeśli użytkownik wciśnie przycisk Anuluj';   exit;  } else {   echo "<p>Hej {$_SERVER['PHP_AUTH_USER']}.</p>";   echo "<p>Twoje hasło to {$_SERVER['PHP_AUTH_PW']}.</p>";  } ?> Powyższy przykład pochodzi z podręcznika PHP. Czy wykorzystując logowanie przeglądarki nie byłoby lepsze? Większość ten sposób obsługuje (jak tam z Lynx?). Wtedy nie byłoby skryptowego zapamiętywania hasła, przeglądarki mają taką możliwość (IE, Firefox na pewno). Oczywiście, okno logowania pokaże się wtedy, gdy istnieje pewne cookie. Jeśli użytkownik jest zapamiętywany, i tak dane muszą być w cookies (hasło będzie zakodowane MD5 albo hash (lub algorytm base64), loginu raczej nie trzeba kodować). Logowanie bez pamiętania danych mogę oprzeć na sesjach. Jest tu jeden problem - session_register()... Da się to jakoś zrobić, by pasowało dla konfiguracji z register globals on i register globals off? Indetyfikator dopisywany byłby do adresu. Co myślicie o logowaniu: <?php  if (!isset($_SERVER['PHP_AUTH_USER'])) {   header('WWW-Authenticate: Basic realm="My Realm"');   header('HTTP/1.0 401 Unauthorized');   echo 'Tekst do wysłania, jeśli użytkownik wciśnie przycisk Anuluj';   exit;  } else {   echo "<p>Hej {$_SERVER['PHP_AUTH_USER']}.</p>";   echo "<p>Twoje hasło to {$_SERVER['PHP_AUTH_PW']}.</p>";  } ?> Powyższy przykład pochodzi z podręcznika PHP. Czy wykorzystując logowanie przeglądarki nie byłoby lepsze? Większość ten sposób obsługuje (jak tam z Lynx?). Wtedy nie byłoby skryptowego zapamiętywania hasła, przeglądarki mają taką możliwość (IE, Firefox na pewno). Oczywiście, okno logowania pokaże się wtedy, gdy istnieje pewne cookie. Więc jak jest najbezpieczniej? Zaraz... da się problem rozwiązać z SQLem. BŁĄD/ROZWIĄZANIE 1. Wpisane dane - komórki w SQLu (sesje własne) Indetyfikator sesji - cookies Typ autoryzacji: sprawdzenie, czy w ID sesji (pobranym z cookies) w SQLu wpisane dane są takie same, jak w danych o użytkowniku. Błąd: zmiana ID sesji może spowodować dostęp do innego użytkownika. Rozwiązanie: dodatkowy element - kod ochrony (także zapisywany w cookies) oraz szyfrowanie. Czy to dobre rozwiązanie? Każda sesja ma inny kod ochrony (generowany m. in. funkcją RAND). Użytkownik Ferrari edytował ten post 22 maj 2005, 16:57 Nie wystarczy hash np. hasła i czasu logowania jako identyfikator sesji? Kto Ci trafi na identyczny, jak jakiś innego usera, i to akurat wtedy gdy tamten użytkownik jest zalogowany (jego sesja istnieje w bazie)?. Bo sesje powinny być niszczone np. po upływie kilkunastu, kilkudziesięciu minut nieaktywności użytkownika. Niszczone... Oczywiście, te, w których użytkownik przy logowaniu nie włączył pamiętania hasła? Tak. Jeśli natomiast user życzyłby sobie o zapamiętanie hasła (a właściwie sesji, tyle, że on by nie wiedział, że to sesja się zapamiętuje, a nie hasło), to zrobiłbym tak, że podczas odtwarzania zapamiętanej sesji generowany byłby jej nowy ID (np. z uwzględnieniem czasu, bo czas ciągle się zmienia). To tylko moje zdanie :) logowanie to dobra sprawa Coś mi się nie udaje. Choć ciastko się zapisuje, w skrypcie nie jest widoczne. Czy w tym przypadku potrzebny jest zapis domeny i ścieżki do SETCOOKIE? Inny problem - RANDOM. Zawsze generowana jest jedna liczba. Dlaczego? $uind=rand(10,100).date(dmHi).rand(10,100); To samo jest zapisywane do ciastka i do bazy, a wartości inne. Zajrzyj TUTAJ Jednak odnosi się to tylko do PHP w wersji < 4.2.0. Może taką masz i dlatego. Mam nawet PHP5. A co do logowania - jakieś uwagi? Potem pokombinuję jeszcze z domeną i ścieżką, ale to nic nie da, jeśli wartości SID będą różne. Pokaż jak "produkujesz" ;) ciasteczka. Random u mnie działa (PHP 5, nie używałem srand()). $xuser=strtolower($snduser); $xpass=md5($sndpass); db_read('ID,login,pass','users','tmpu','oa',' WHERE login="'.$xuser.'"'); if(empty($tmpu['login']) || empty($tmpu['pass'])) { exit; } if($tmpu['login']===$xuser && $tmpu['pass']===$xpass) {  $uind=rand(10,100).date(dmHi).rand(10,100);  if(isset($sndr))  {  $utime=600;  }  else  {  $utime=2300000;  }  db_q('INSERT INTO '.$db_pre.'sessions VALUES ('.$uind.','.$tmpu['ID'].',"'.$xuser.' ","'.$xpass.'",'.$utime.')');  setcookie($cms_c.'login',$uind,time()+$utime) or exit;  unset($uind,$utime);  Header('Location: http://'.$_SERVER['HTTP_HOST'].'/'.dirname($_SERVER[ 'PHP_SELF']).'/index.php');  exit; } To jest aktualny kod. 1. Cookies jest niewidoczne. Czy w tym przypadku potrzebna są: domena i ścieżka? 2. RAND() generuje liczbę poprawnie, lecz do bazy zamiast $uind próbuje się wcisnąć zawsze jedna i ta sama wartość. Dlaczego? Jeden problem rozwiązałem (z bazą) - za długa wartość była. Co więc z cookies? Są niewidoczne (dlaczego?). Teraz cookies są widoczne (spowodowane dwoma znakami / w adresie). Zobacz do HEADER - ta część kodu przekierowuje na wykryty przez PHP adres. Czy lepiej będzie, gdy w pliku konfiguracyjnym wstawię zmienną z domeną i ścieżką i z tych danych korzystać (w header)? LOGOWANIE NAPRAWIONE. Wprowadzę jednak domenę i ścieżkę do konfiguracji. PHP nie zawsze musi poprawnie wykryć wszystko i cookies może się nie odczytywać. Użytkownik przy instalacji i w konfiguracji będzie miał wgląd do tych danych. Jeszcze jedno Jak tu najlepiej sprawdzać czas upływu sesji? Użytkownik Ferrari edytował ten post 23 maj 2005, 21:16 Jeśli dobrze myslę to $utime jest u ciebie czasem upływu, a właściwie czasem zdatności do użycia. No to chyba musisz jeszcze zapisać czas, w któym sesja została stwrzona, albo po prostu pod $utime zapisz time()+czas_aktywności_sesji. Potem to już tylko porównywanie tego z aktualnym czasem. OK - nie dałoby się tego zapisać pod mniejszymi liczbami, nie kombinując z datami (np. 2005 jako skrócenie)? Samego roku nie możesz zapisać, chyba, że czas dla sesji określałbyś w latach ;) Dlateczo zależy Ci żeby to były krótsze wpisy? Zresztą jak zapiszesz time(), czyli liczbę całkowitą to zajmie ona tylko 4 bajty (chyba), w końcu to integer. By było krócej, czas będzie liczony od roku 2005. Zamiast INT zastosuję varchar. Dobrze by było, gdyby użytkownik nie został wylogowywany po upływie czasu np. 5 min, gdy ma otwarte okno przeglądarki. Da się tak zrobić, by przy zamknięciu okna przeglądarki wysłać polecenie do SQLa? |
|||
Sitedesign by AltusUmbrae. |