Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: session i autowylogowywanie
Forum PHP.pl > Forum > PHP
kilofmar
Witam.
Mam taki prosty system logowania w którym ustawiam czas bezczynności po jakim użytkownik automatycznie zostanie wylogowany.
I problem polega na tym że w niektórych przypadkach wylogowuje użytkowników dużo wcześniej, nie wiem od czego to zależy.
Czas sesji mam ustawiony na około 25min a czasem wylogowuje już po 5-10min

kod który za każdym przeładowaniem jest wywoływany
  1. $CzasSessi= intval($config['czas_sessi']); //25min
  2.  
  3.  
  4. if (isset($_SESSION['czas']) and $_SESSION['czas']+60*$CzasSessi<time()) { // 30 minut
  5. }else {
  6. $_SESSION['czas'] = time();
  7. }
  8.  
  9. if (isset($_SESSION['zalogowany']) && $_SESSION['zalogowany']) {
  10. //dostęp po zalogowaniu
  11.  
  12. ...
  13. }else{
  14. //powrót do strony logowania
  15. }
  16.  


Od logowania
  1. $Pass = mysql_real_escape_string(md5($_POST['password']));
  2. $Username = mysql_real_escape_string(addslashes($_POST['username']));
  3. $query = sprintf("SELECT * FROM `uzytkownicy` WHERE `login` = '%s' AND `haslo` = '%s' LIMIT 0,1", $Username, $Pass);
  4. $result = $SQL->Query($query);
  5. if ($SQL->Rows($result) > 0) {
  6. $_SESSION['zalogowany'] = true;
  7. }


W ogóle co byście poradzili aby zwiększyć bezpieczeństwo?
gandziorz
Cytat(kilofmar @ 12.06.2013, 18:05:07 ) *
Witam.
Mam taki prosty system logowania w którym ustawiam czas bezczynności po jakim użytkownik automatycznie zostanie wylogowany.
I problem polega na tym że w niektórych przypadkach wylogowuje użytkowników dużo wcześniej, nie wiem od czego to zależy.
Czas sesji mam ustawiony na około 25min a czasem wylogowuje już po 5-10min

kod który za każdym przeładowaniem jest wywoływany
  1. $CzasSessi= intval($config['czas_sessi']); //25min
  2.  
  3.  
  4. if (isset($_SESSION['czas']) and $_SESSION['czas']+60*$CzasSessi<time()) { // 30 minut
  5. }else {
  6. $_SESSION['czas'] = time();
  7. }
  8.  
  9. if (isset($_SESSION['zalogowany']) && $_SESSION['zalogowany']) {
  10. //dostęp po zalogowaniu
  11.  
  12. ...
  13. }else{
  14. //powrót do strony logowania
  15. }
  16.  


Od logowania
  1. $Pass = mysql_real_escape_string(md5($_POST['password']));
  2. $Username = mysql_real_escape_string(addslashes($_POST['username']));
  3. $query = sprintf("SELECT * FROM `uzytkownicy` WHERE `login` = '%s' AND `haslo` = '%s' LIMIT 0,1", $Username, $Pass);
  4. $result = $SQL->Query($query);
  5. if ($SQL->Rows($result) > 0) {
  6. $_SESSION['zalogowany'] = true;
  7. }


W ogóle co byście poradzili aby zwiększyć bezpieczeństwo?

Odnośnie zapytań do bazy danych to:
1. Zamiast addslasches używaj funkcji preg_match i sam ustaw jakie znaki moga sie pojawiac, ja tez kombinowałem jak się dało i wyszło że najbezpieczniej filtrować wszystko za pomocą preg_match.
2. Używaj biblioteki PDO do bazy danych

Przy czym jeżeli opierasz logowanie na sesjach to warto by troche zmodyfikowac:
  1. if ($_SESSION['zalogowany'] == true AND $_SESSION['ip'] == $_SERVER['REMOTE_ADDR']) {


Przy logowaniu:
  1. if ($SQL->Rows($result) > 0) {
  2. $_SESSION['zalogowany'] = true;
  3. $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
  4. }


Jednak zabezpieczenie troche slabiutkie i to nawet bardzo. Powinienes dac wiecej parametrow do walidacji. Takich jak login, haslo, id sesji, IP, przegladarka itd. Jak sesja "zalogowana" jest true to nastepnie walidacja reszty danych i porownywanie z baza danych jak wszystko okej to dopiero klient moze sobie ogladac co tam chcial.

U mnie wyglada to tak ze jezeli wszystkie wymagane sesje istnieja to zaczyna sprawdzac.
1. czy jest taki login?
2. czy haslo jest prawidlowe?
3. czy ip sie zgadza?*
4. czy przegladarka sie zgadza?*
*Podczas logowania, jezeli wpisany login i haslo jest prawidlowe to w bazie danych zapisuje aktualne IP i nastepnie porownywane jest IP klienta z tym co jest w bazie. Jak ktos przejmie sesje a bedzie uzywal innej przeglarki lub ma inne ip to i tak go wyloguje.

Mozna dac wiecej kryteriow, wszystko zalezy jak bardzo strona dla uzytkownika wymaga zabezpieczen. Hasla zabezpieczam przez dodanie ciagu znakow do hasla a nastepnie przez hashowanie SHA256. Zeby bylo bardziej "dziwnie" to w sesji haslo zapisuje tylko ciag 16 znakow z 32, "wycinam" srodek. Nastepnie dla porowania pobieram haslo z bazy, hashuje i sprawdzam czy srodkowe ciagi sie pokrywaja.

Sa rozne metody, im bardziej "wlasna" tym bezpieczniejsza smile.gif
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.