Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> logi w systemie logowania
mis
post 11.12.2011, 12:46:47
Post #1





Grupa: Zarejestrowani
Postów: 71
Pomógł: 2
Dołączył: 25.04.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
tehaha
post 11.12.2011, 15:42:19
Post #2





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
mis
post 11.12.2011, 18:48:51
Post #3





Grupa: Zarejestrowani
Postów: 71
Pomógł: 2
Dołączył: 25.04.2010

Ostrzeżenie: (0%)
-----


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ł?

Ten post edytował mis 11.12.2011, 18:58:21
Go to the top of the page
+Quote Post
tehaha
post 11.12.2011, 19:26:56
Post #4





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


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

Go to the top of the page
+Quote Post
marins
post 11.12.2011, 22:25:06
Post #5





Grupa: Zarejestrowani
Postów: 47
Pomógł: 4
Dołączył: 12.07.2003

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
mis
post 11.12.2011, 23:18:22
Post #6





Grupa: Zarejestrowani
Postów: 71
Pomógł: 2
Dołączył: 25.04.2010

Ostrzeżenie: (0%)
-----


  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?

Ten post edytował mis 11.12.2011, 23:25:08
Go to the top of the page
+Quote Post
tehaha
post 12.12.2011, 00:04:41
Post #7





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
mis
post 12.12.2011, 00:07:04
Post #8





Grupa: Zarejestrowani
Postów: 71
Pomógł: 2
Dołączył: 25.04.2010

Ostrzeżenie: (0%)
-----


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.

Ten post edytował mis 12.12.2011, 00:23:40
Go to the top of the page
+Quote Post
Crozin
post 12.12.2011, 00:26:33
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
mis
post 12.12.2011, 01:56:11
Post #10





Grupa: Zarejestrowani
Postów: 71
Pomógł: 2
Dołączył: 25.04.2010

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
Crozin
post 12.12.2011, 09:02:51
Post #11





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
mis
post 12.12.2011, 09:25:35
Post #12





Grupa: Zarejestrowani
Postów: 71
Pomógł: 2
Dołączył: 25.04.2010

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 13:18