Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: logi w systemie logowania
Forum PHP.pl > Forum > PHP
mis
Hej,
stworzyłem systemik logowania, teraz chce dodać kolejne zabezpieczenie jakim jest ilość prób logowania.
Wydaje mi się, że najlepszym wyjściem jest stworzenie nowej tabeli, gdzie będzie zapis ost. logowanie,id,ip,user agent itp
i sprawdzać stąd ostatnie logowania. potem można zrobić zakładkę 'historia logowań'.

Potem np. wpisy starcze niż 30dni kasować.
Gdy ilość wpisów(gdzie np. kolumna status = 1 - czyli błędne logowania) będzie np. >= 5 i czas nie większy niż np. 1h wtedy blokuje konto na 20min.

Niestety każdy będzie mógł zablokować innej osobie konto, ale na to chyba nie da rady nic poradzić?


Jak myślicie?
Jak takie coś najlepiej rozwiązac
tehaha
nie blokuj po nicku, bo wtedy jakiś dowcipniś zablokuje Ci wszystkich użytkowników z automatu, blokuj po IP, a najlepiej to nie blokować tylko po kilku próbach captcha do przepisania i wymuszać na użytkowników dobre hasła
mis
po 1 przepraszam za 2 tematy takie same(coś mi się FF zawiesił)

po 2 faktycznie, lepiej dane IP zablokować, jestem jednak pewien, że chce zrobić po 5 próbach blokada konta na 15min.
Jakie kolumny w tabeli z logami powinny być według Was i jak powinien taki schemat wygladać?

Chce zrobić próby, bo jak wspominałem, planuje zrobić podstrone z logami logować.

czy jednak uważacie, że to zły pomysł?
tehaha
No ale powiedz mi po co blokować dostęp użytkownikowi? Chcesz go odstraszyć czy uważasz to za jakieś zabezpieczenie? Przecież nie ma nic złego w tym, że użytkownik podejmie 7 czy 10 prób logowania, to przed czym powinieneś się zabezpieczyć, to żeby ktoś nie napisał automatu, który będzie próbował złamać hasło, dlatego skutecznie zrobisz to, jeżeli po kilku błędnych próbach pojawi się dodatkowo captcha do przepisania, automat wtedy już nie przejdzie. Dodatkowo przy rejestracji podczas walidacji danych powinieneś wymagać od użytkownika, żeby hasło miało przynajmniej te 6 znaków i najlepiej, żeby zawierało cyfrę i nie było identyczne z loginem, czy adresem e-mail. Blokowanie czasowe IP robi się jako zabezpieczenie przed flood'em, ale to już inna kwestia.

a co do tabeli to jak tam sobie chcesz możesz zrobić jakąś prostą tabelę typu:
login_attemtps:
id (INT)
ip (VARCHAR)
date (TIMESTAMP)

i przy logowaniu zapytaniem zliczasz ilość prób dla danego IP w ostatnich 5 minutach
SELECT COUNT(id) AS count FROM login_attempts WHERE ip = $ip AND date > DATE_SUB(NOW(), INTERVAL 5 MIN)

lub nawet prościej, możesz każdą próbę wrzucać do sesji

oczywiście pamiętaj o zabezpieczeniu zapytania przed sql injection, używaj funkcji mysql_real_escape_string(), a najlepiej PDO prepared statements

marins
W jednym z moich portali dałem możliwość 10 błędnych prób logowania - przy czym po 3 próbie - pole hasło nie jest type="password" ale jako zwykłe pole tekstowe aby móc wyłapać błąd. do tego hasło min 6 znaków - koniecznie duża litera, mała i cyfra.

po 10 nieudanych logowaniach - blokada na 20 min na $_SESSION - nigdy nie blokuj konta (to nie bank).
mis
  1. if($_SESSION['login'] == 1)
  2. {
  3. header("location:index.html"); // Przekierowanie do index.html
  4. }
  5. elseif ($_SESSION['login'] == 0) { // dostęp dla niezalogowanego użytkownika
  6.  
  7. if (!isset($_POST['send']))
  8. header("location:index.html");
  9. else
  10. { // jeżeli formularz został wysłany, to wykonuje się poniższy skrypt
  11.  
  12. include('./header.php');
  13. $login = mysql_real_escape_string(strip_tags(trim($_POST["login"])), ENT_QUOTES);
  14. $haslo = $_POST["haslo"];
  15.  
  16. $wynik=mysql_query("SELECT password, salt, register, user_groupid,user_id FROM `users` WHERE username='$login';");
  17. $row = mysql_fetch_assoc($wynik);
  18. $salt = $row['salt'];
  19. $password = $row['password'];
  20. $register = $row['register'];
  21. $generowane_haslo = md5(sha1($haslo.'+'.$salt.'%$^'.$register)); //generuje wynik "podwójnej soli"
  22.  
  23. if ($password == $generowane_haslo) {
  24. $_SESSION["username"] = $login;
  25. $_SESSION['login'] = 1;
  26. @dbquery('UPDATE users SET lastvisit = "'.time().'" WHERE user_id = ' . $row['user_id']);
  27. echo importantboxbig('Dziękujemy za zalogowanie się jako '.$login.'.<br> Zostaniesz przeniesiony na stronę główną za 3 sekund.','Przekierowanie...');
  28. echo '<meta http-equiv="refresh" content="3; url=index.html">';
  29.  
  30. }else {
  31. echo errorbox('Zostały wprowadzone nieprawidłowe dane');
  32. }
  33. }
  34. }


a o takim systemie logowania co powiecie.
ilość znaków w haśle itp, obsługuje jquery (jak coś źle, to nie da rady wysłać), czy z poziomu php też to zabezpieczyć?
Planuje jeszcze do tego dodać te logi i jak piszecie to po np. 5 próbach dodać token.

Ilość prób zrobić w mysql czy jako sesje?
tehaha
Cytat
ilość znaków w haśle itp, obsługuje jquery (jak coś źle, to nie da rady wysłać), czy z poziomu php też to zabezpieczyć?
Zawsze walidację rób po stronie php, a jquery traktuj tylko jako wygodny dodatek, bo wyłączyć obsługę js w przeglądarce to każdy dzieciak umie.

Cytat
Ilość prób zrobić w mysql czy jako sesje?

Jeżeli nie zamierzasz tych danych do niczego więcej wykorzystywać to lepiej oprzeć to na sesji
mis
Cytat(tehaha @ 12.12.2011, 00:04:41 ) *
Zawsze walidację rób po stronie php, a jquery traktuj tylko jako wygodny dodatek, bo wyłączyć obsługę js w przeglądarce to każdy dzieciak umie.


Faktycznie, dzięki, nie pomyślałem o tym.
* Chociaż podczas pogowania, musi być to sprawdzane? w przypadku rejestracji oczywiście jest w php

Cytat(tehaha @ 12.12.2011, 00:04:41 ) *
Jeżeli nie zamierzasz tych danych do niczego więcej wykorzystywać to lepiej oprzeć to na sesji

no raczej do niczego tego nie wykorzystam, bo po co?

A ogólnie coś byś poprawił/dodał/zmienił, chodzi o bezpieczeństwo i optymalizacje.
Crozin
1. Wymuszenia na ilość znaków czy rodzaj znaków w haśle są wyjątkowo irytujące - nie Twój, jako administratora interes jakie jest moje hasło. Lepiej podawaj na bieżąco podczas jego wpisywania jego "siłę", którą to już możesz sobie w dowolny sposób oszacować. Ale jak będę chciał założyć jakieś śmieciowe konto z hasłem "qwerty" to daj mi je założyć.
2. Jak już wspomniano: nie blokuj konta, a wymuszaj wpisanie jakiejś CAPTCHA-y - to znacznie wygodniejsze rozwiązanie dla użytkowników.
3. Składować najprawdopodobniej wystarczy podstawowe dane: datę i czas, IP, id użytkownika (jeżeli w ogóle istnieje) - o przechowywaniu adresu IP możesz poczytać tutaj: http://forum.php.pl/index.php?showtopic=188630&hl=
4. Nigdy nie wyświetlaj hasła użytkownika (dotyczy to również pola typu password), a już szczególnie na stronach niezabezpieczonych SSL-em. Jak już to dodaj opcję "[x] pokaż hasło", które przy pomocy JS zamieni pole typu password na text po stronie klienta.
5. Informacje o nieudanych logowaniach musisz przechowywać w bazie danych - może to być tabela przechowywana bezpośrednio w pamięci, w przypadku MySQL jest to typ HEAP / MEMORY. Sesje można bez problemu zrestartować dla każdego żądania. Ba! Trzeba zadać sobie nieco trudu by ją w ogóle podtrzymać, dlatego też większość takich robotów tego nawet nie próbuje robić.
6. Sam nagłówek Location nie gwarantuje przekierowania, dlatego też po jego wystąpieniu powinieneś zawsze wyświetlić chociażby najprostszy dokument HTML w stylu:
  1. ...
  2. <html ...><head>...</head><body><p>Przekierowanie na <a href="URL">URL</a>.</p></body></html>
Oraz zakończyć działanie skryptu - exit.
mis
Dzięki za cenne porady!

a powiedzcie mi, jeżeli stworzyłem tabele, to teraz przy każdym odpalaniu strony, bedę musial sprawdzać czy suma logowac z ostatnich 5minut jest większa niż 5, czy zrobić tak, że tylko podczas logowania sprawdza i jak jest już 5 to tworzy sesje i wtedy działa na sesji ?
Crozin
Dlaczego miałbyś coś związanego stricte z logowaniem sprawdzać na każdej podstronie? Przy każdym logowaniu sprawdzasz i ten element mechanizmu logowania akurat nie powinien korzystać w ogóle z sesji.

PS. Pamiętaj aby po poprawnym zalogowaniu wyczyścić informację o niepoprawnych.
mis
Cytat(Crozin @ 12.12.2011, 09:02:51 ) *
Dlaczego miałbyś coś związanego stricte z logowaniem sprawdzać na każdej podstronie? Przy każdym logowaniu sprawdzasz i ten element mechanizmu logowania akurat nie powinien korzystać w ogóle z sesji.

PS. Pamiętaj aby po poprawnym zalogowaniu wyczyścić informację o niepoprawnych.


1. Mam logowanie także w headerze, więc jak jest ilość >=5 to dodaje się dodatkowe pole(token). Wydaje mi się, że Sesja tu nie zaszkodzi, bo przy logowaniu i tak jej nie sprawdza, potrzebna jest tylko do wyświetlania tokena. Jak ktoś przejmie sejse czy coś, to i tak przy logowaniu wyskoczy błąd, że tokien nieprawidłowy.

2. Czyli wykasować błedne logowania z bazy?
Tu mi się wydaje, że te 5min to każdy będzie zalogowany.
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.