Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Prosty sposób na uwierzytelnianie użytkownika
Forum PHP.pl > Forum > Przedszkole
permanent
Witam. Mam prostą stronę w PHP z systemem logowania użytkowników, kilkanaście podstron dostępnych po zalogowaniu i wyświetlane są osobne dane dla każdego użytkownika.

Jaki jest dobry, prosty i bezpieczny sposób na uwierzytelnianie użytkownika?

Jestem początkujący w PHP i chciałbym spytać czy mój sposób jest poprawny?

Plik index.php wyświetla stronę, w nim robię include podszczególnych podstron. Na samym początku mam:


W formularzu logowania jeżeli dane z bazą się zgadzają to podstawiam nick pod pierwszą zmienną, druga zmienna to aktualny adres IP, trzecia to informacja o zalogowaniu:

  1. $_SESSION['user_name'] = $q_user['username'];
  2. $_SESSION['user_ip'] = $_SERVER['REMOTE_ADDR'];
  3. $_SESSION['user_logged'] = 'OK';


Wcześniej jeszcze mam zdefiniowaną prostą funkcję:

  1. function check_session()
  2. {
  3. if($_SESSION['user_logged'] == 'OK' && $_SESSION['user_ip'] == $_SERVER['REMOTE_ADDR']) return 1;
  4. else return 0;
  5. }


No dobra, teraz przed wyświetleniem strony dla użytkownika robię:

  1. if(check_session() == 1)
  2. {
  3. // wyświetlenie podstrony
  4. }


Przykładowe dane dla użytkownika wyciągam w sposób:
  1. $query = mysql_query('SELECT * FROM `data` WHERE `user`="'.$_SESSION['user_name'].'"');


Dodatkowo mam funkcję, która na bieżąco sprawdza czy poruszamy się na stronie (ostatni ruch). Jeżeli przez 2 godziny nie korzystaliśmy ze strony to automatycznie wylogowywuje:

  1. function destroy_session()
  2. {
  3. global $unixtime;
  4. if(check_session() == 1)
  5. {
  6. $expirytime = 7200;
  7. if(!isset($_SESSION['last_trace'])) $_SESSION['last_trace'] = $unixtime;
  8. else if((int)$_SESSION['last_trace'] + $expirytime < $unixtime)
  9. {
  10. $sessionName = session_name();
  11. $_SESSION = array();
  12. if(isset($_COOKIE[$sessionName])) setcookie($sessionName, '', $unixtime - 3600, '/');
  13. return 1;
  14. }
  15. }
  16. }


No i w index.php:
  1. if(destroy_session() == 1) echo 'Zostales wylogowany ze wzgledow bezpieczenstwa';


Proszę o opinie i rady. Strona jest prosta, jednak zawiera poufne dane użytkowników i nie dopuszczam żadnego włamu na stronę. Skrypt ma być prosty i bezpieczny. Kiedyś przy logowaniu miałem session_register(...), jednak mam nową wersje PHP i tego chyba już się nie używa?

Czy cokolwiek zmienić w tym kodzie? Czy jest to na 100% bezpieczny sposób? Pozdrawiam.
b4rt3kk
Zamiast sprawdzania IP użytkownika (co się stanie jeśli użytkownik korzysta z proxy?) korzystaj z ciasteczek (czy istnieje? czy zawiera prawidłowe dane?), sprawdzaj także czy klucz obecnej sesji (session_id()) zgadza się z tym który przypisano użytkownikowi.
Bardziej rozpowszechnionym rozwiązaniem jest przyrównywanie ID użytkownika, a nie jego nicku (sprawdzasz przy rejestracji czy taki już istnieje?) przy wykonywaniu zapytań.
Nie musisz mieć funkcji, która wylogowuje, wystarczy że ustawisz odpowiedni czas żywotności sesji.

To czy jest to bezpieczny sposób zależy także od tego jak wygląda formularz logowania od strony PHP.
gitbejbe
no to się podpinam, ale odnośnie logowania.

Powiem jak to wygląda z mojej strony i ciekawi mnie czy jest to też dobre rozwiązanie.
Każdą zmienną z formularza logowania owijam w htmlspecialchars.

logowanie odbywa sie poprzez podania loginu albo maila no i hasła.
Tak więc póżniej sprawdzam czy pole loginu to login czy email przez preg_match.

jesli ktoś zalogował sie po mailu to mam pewnosc ze uzyl znaków tylko dozwolonych dla maila.
jeśli ktoś logosuje się po loginie to sprawdzam też przez preg_match czy są dozwolone znaki.
to samo dla hasła.

jesli się wsio zgadza, sprawdzam w bazie czy ktoś taki istnieje i go loguje, tworząc przy tym sesje z loginem usera oraz zaszyfrowane ciastko.
ciastko składa sie z informacji o przegladarce, ip loginie i pola extra. Za kązdym załadowaniem strony sprawdzam najpierw czy istnieje sesja, później czy istnieje ciastko i czy hash, który sie w nim znajduje jest ok.
i to tyle

questionmark.gif
nospor
Cytat
Każdą zmienną z formularza logowania owijam w htmlspecialchars.
W celu że powodu?

Cytat
to samo dla hasła.
A Ty co, mbank jesteś że człowiek nie może mieć hasła jakie sobie zażyczy?
gitbejbe
co do "owijania" to mam taki przezorny nawyk.

"jak w mbanku " ? Nie wiem, nie jestem ich klientem. Po za tym słabo starasz się być upierdliwy... nigdzie nie napisałem jaki zakres znaków posiada walidacja hasła w moim formularzu, no ale taki wyga jak Ty już pewnie dawno mnie namierzył, włamał się na mojego localhosta i pobrał wszystkie pliki

idź się prześpij albo bądź fajny gdzie indziej
nospor
Cytat
co do "owijania" to mam taki przezorny nawyk.
To nie nawyk, to nadgorliwość. I jest takie fajne powiedzonko na ten temat.

Cytat
idź się prześpij albo bądź fajny gdzie indziej
Wow, ktoś tu wstał lewą nogą i nie potrafi przyjąć zwykłej uwagi.
Damonsson
Ale po co jakaś walidacja hasła, choćbyś nawet zabronił 1 znaku, to po co, jaki sens tego?

Formularz logowania i htmlspecialchars? Niektórzy zdolni inaczej stosują do rejestracji coś takiego, ale do logowania, to jeszcze nie słyszałem. Przed czym ma Cię to uchronić?
gitbejbe
dobra dobra, nie wymiguj się ;p
nie mam zamiaru polemizować o bzdetach. Nie po to tutaj wchodzę. Jeśli masz uwagi, to chętnie je przeczytam jeśli będą wnosić coś więcej niż docinke

edit: nie przeczytalem ostatniego posta.

po co walidacja ? jak to każdego formularza. Na podstawie tego loginu i hasła idzie zapytanie do bazy, chyba że o czymś nie wiem
nospor
Cytat
, to chętnie je przeczytam jeśli będą wnosić coś więcej niż docinke
Yyy, że co? Jaką docinkę? Wypisujesz totalnie niepotrzebne rzeczy a ja ci zwracam na to uwagę. To nie jest żadna docinka,tylko zwrócenie uwagi, bo jeszcze jakiś początkujący, jak autor tego tematu, pomyśli że tak ma być. Wyluzuj chłopie bo ci żyłka na czole pęknie.

Cytat
po co walidacja ? jak to każdego formularza. Na podstawie tego loginu i hasła idzie zapytanie do bazy, chyba że o czymś nie wiem
Mówimy tu o haśle. I hasła zazwyczaj do bazy nie wstawia się tak jak wpisuje user, tylko stosuje się hashe i tym podobne rzeczy.
Damonsson
A na przykład o bindowaniu zapytań sql słyszał?
b4rt3kk
Cytat(gitbejbe @ 20.06.2013, 13:03:57 ) *
dobra dobra, nie wymiguj się ;p
nie mam zamiaru polemizować o bzdetach. Nie po to tutaj wchodzę. Jeśli masz uwagi, to chętnie je przeczytam jeśli będą wnosić coś więcej niż docinke

edit: nie przeczytalem ostatniego posta.

po co walidacja ? jak to każdego formularza. Na podstawie tego loginu i hasła idzie zapytanie do bazy, chyba że o czymś nie wiem


Co do loginu - wystarczy pozbyć się apostrofów, ew. używać PDO. Co do hasła - idzie w zahashowanej formie (chyba że trzymasz je jawnie?) także użytkownik może sobie wpisywać co tam chce, bo do zapytania i tak trafi hash z tego.
gitbejbe
fakt, pominąłem wzmiankę o kodowaniu hasła.
dobra jeszcze raz:

waliduje oba pola - login i hasło, pod wzgledem dozwolonych znaków. Robię to aby wyeliminować głównie niebezpieczne znaki typu < > ' ".
jak wiem, że tych znaków nie ma, sprawdzam, czy istnieje ktoś o podanym logonie i pobieram jego hasło i losowy hash tworzony przy rejestracji.
koduje hasło wg swojej soli i sprawdzam czy zgadza się z tym w bazie. Jeśli jest wszystko ok , tworze sesje i ciastko i koniec.

Wole dmuchać na zimne i poświecieć te 5 min dłużej kodowania aby spaawdzić wszystkiego co można, niż się później zastanaiwac gdzie popełniłem błąd. Są ludzie mądrzejsi ode mnie i to co mi może wydawac się bezpieczne, dla innych okazac się może dobrą luką. Wiem, że zapytanie idzie po loginie i nie muszę sprawdzać hasła - przynajmniej tak mi się wydaje, ale z wolę mimo to wyzbyć się wątpliwości i zrobić to raz a dobrze i o tym nie mysleć.
nospor
Cytat
Robię to aby wyeliminować głównie niebezpieczne znaki typu < > ' ".
I to ci się staramy wyjaśnić od jakiegoś czasu: znaki, które wymieniłeś w żaden sposób nie są niebezpieczne jeśli chodzi o hasło.

A robiąc taką walidację, blokujesz komuś założenie jego ulubionego hasła, tak jak to robi teraz nowa odsłona mbanku, stąd moja wcześniejsza wzmianka o tym. Poczytaj na necie, ludzie mają ubaw i łzy w oczach gdy nie mogą się zalogować na hasła, które do tej pory działały....
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.