Skocz do zawartości
Szymon

System Uzytkownikow (php I Mysql)

Rekomendowane odpowiedzi

Potrzebuje zrobic "system" logowania uzytkownikow z uzyciem bazy mysql. Generalnie mam wyborazenie jak to ma wygladac ale nie o tym chcialem.... :-) Pierwszy problem na jaki napotkalem :> to czy kto moglby mi podsunac jakis pomysl, jak rozwiazac problem sesji , kazdeo z uzytkownikow. To znaczy cos co jest na forach, ze przykladowo prywatne wiadomosci mozna obejzec tlyko po zalogowaniu, a bez tego nie. JEzeli dobrze rozumuje :) to ma to zwiazek z cookies`ami, szukalem w knigach ktorymi dysponuje, ale nie moge znalezc konkretnie tego o co mi chodzi :-(. Mam nadzieje ze wyrazilem sie mniej wiecej jasno , o co mi chodzi :-). Bede wdzieczny za kazdą pomoc.

 

edit: z tego co wyczytalem ma to zwiazek z SESJAMI :) ale co i jak;(

Edytowane przez Szymon

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

skoro wiarze sie z php i sesjami to trza bylo zaczac od maluala do php - jest genialny:

 

http://pl2.php.net/session

 

w srocie robisz sobie w pliku sekcje (ifami) do ktorych ma sie dostep dopiero jak jest ustawiona zmienna sesyjna. np:

 

if ($_SESSION['zalogowany'] != 1){   print "blad";  //i np autoredirect;}else{  cialo wlasciwe i np switch rozdzialajacy na akcje;}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

ja od cookiesów proponowałbym odchodzic... IE6 ma domyślnie zablokowane cookiesy i malo kto sam sobie je włącza... trzeba szukac innych metod, np. nie zrywać połączenia z bazą mysql?

Edytowane przez rojmarek

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tylko niech któryś z panów raczy zauważyć, że domyślnie SESJE pracują w oparciu o COOKIES. Więc ciasteczek nikt nie uniknie :)

 

Natomiast generalnie bezpieczny system wygląda mniej więcej tak:

 

1.Jest jakiś formularz logowania, powiedzmy w pliku login.php. W formularzu użytkownik wpisuje swój login i hasło. Skrypt sprawdza (np. w bazie danych) czy te dane są poprawne. Jeżeli nie, to wyświetla komunikat, że ACCESS DENIED :) Natomiast jeśli wszystko jest OK, ustawia w sesji 3 zmienne:

<?php....//login i password sa oksession_start();$_SESSION['_login'] = $login;$_SESSION['_password'] = $password; //tutaj warto pomyśleć o szyfrowaniu/hashowaniu haseł, np md5()$_SESSION['_lastAction'] = time();header('Location: index.php'); //przekierowanie po zalogowaniu?>

2.Na każdej podstronie wymagającej logowania sprawdzasz czy user jest zalogowany:

 

<?php$limit = 1800; //limit 1800 sekund czyli 30 minutsession_start();//sprawdzamy czy w ogóle zmienne są ustawione:if(isset($_SESSION['_login']) && isset($_SESSION['_password']) && isset($_SESSION['_lastAction'])) {      if( (time()-$_SESSION['_lastAction']) >$limit) {         //limit czasu przekroczony!     }     $_SESSION['_lastAction'] = time(); //aktualizujemy licznik czasu     // teraz sprawdzasz w bazie danych czy $_SESSION['_password']      // i $_SESSION['_login'] są poprawne (robisz to samo co w login.php)    //jeżeli wszystko jest ok, DOPIERO TERAZ masz pewność, że user jest      //zalogowany}else { //user nie zalogowany, wyświetlić komunikat czy coś :)}?>

3.Wylogowanie - najprostsza sprawa :) Musisz po prostu usunąć dane z sesji:

 

<?phpsession_start();unset($_SESSION['_login']);  //usuwamy daneunset($_SESSION['_password']);unset($_SESSION['_lastAction']);header('Location: index.php'); //Przekierowanie?>

Generalnie na tej zasadzie opiera się mechanizm autoryzacji większości skryptów, w tym w skryptach typu phpBB czy InvisionPowerBoard :) Bardzo złym nawykiem jest ustawianie czegoś w rodzaju $_SESSION['zalogowany']. O ile w sesjach jeszcze jakoś to przejdzie, o tyle gdybyś to robił na ciastkach to już w ogóle katastrofa :)

 

Natomiast żeby uprościć kod sprawdzania czy user jest zalogowany, możesz wpisać ten kod JEDEN RAZ do jakiegoś osobnego pliku w formie funckji, która zwraca true gdy logowanie poprawne lub false gdy użytkownik nie jest zalogowany. Wtedy sprawdzanie wyglądałoby tak:

 

<?phprequire('auth.php'); //tu trzymamy skrypt autoryzacjiif( zalogowany() ) {  // WSZYSTKO OK.}else { //ACCESS DENIED :)}?>
Edytowane przez mr__y

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tylko niech któryś z panów raczy zauważyć, że domyślnie SESJE pracują w oparciu o COOKIES. Więc ciasteczek nikt nie uniknie :)

Jak to nie?

Opcja session.use_only_cookies domyslnie jest wylaczona, zatem jak klient ma ciacha wylaczone to SID sie przekaze przez URL'a i problemu nie ma.

 

Natomiast generalnie bezpieczny system wygląda mniej więcej tak:

 

1.Jest jakiś formularz logowania, powiedzmy w pliku login.php. W formularzu użytkownik wpisuje swój login i hasło. Skrypt sprawdza (np. w bazie danych) czy te dane są poprawne. Jeżeli nie, to wyświetla komunikat, że ACCESS DENIED :) Natomiast jeśli wszystko jest OK, ustawia w sesji 3 zmienne:

[...]

Ja bym do tego jeszcze dorzucil IP do sesji zaraz po zalogowaniu (i sprawdzanie tego potem na kazdej stronie, na ktorej trzeba byc zalogowanym). Znacznie utrudnia to mozliwosc przejecia sesji, poniewaz zaweza ludzi, ktorzy moga ja przejac do tych z tego samego IP, a wiec dotyczy tylko sieci za NAT'em. Mozna sie pokusic nawet o hash wiekszej ilosci danych (IP, przegladarka etc.), wtedy moznaby jeszcze zawezyc grono ludzi mogacych przejac sesje.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jak to nie?

Opcja session.use_only_cookies domyslnie jest wylaczona, zatem jak klient ma ciacha wylaczone to SID sie przekaze przez URL'a i problemu nie ma.

O ile SID w linkach zostanie dorzucony automatycznie, o tyle we wszystkich redirectach trzeba go dodawać ręcznie. Czyli ogólnie nieco zabawy, zwłaszcza jeżeli skrypt jest dość duży.

 

Natomiast dodawanie dodatkowych informacji (IP, przeglądarka etc) jest dobrym pomysłem i można stopniowo rozbudować mechanizm logowania o takie elementy.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

O ile SID w linkach zostanie dorzucony automatycznie, o tyle we wszystkich redirectach trzeba go dodawać ręcznie. Czyli ogólnie nieco zabawy, zwłaszcza jeżeli skrypt jest dość duży.

No tak.. ale napisales, ze sie ciastek nie ominie, wiec musialem interweniowac :)

Pozatym redirecty to nie problem.. tak samo jak podales propozycje zamkniecia sprawdzania logowania w funkcje, tak samo mozna przeciez zrobic sobie funkcje wrapujaca redirecta, ktora sama sie zajmie dodaniem SID'a do linka, takze problem znowu znika ;]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

yghh :)

1431486[/snapback]

:mur:

Ogólnie każdy sposób na system logowania/rejestracji ma swoje minusy i plusy, czy to cookie czy sesje-cookisowate czy czyste sesje, nic nie jest doskonałe dla każdego powinno to stanowić indywidualny wybór czego użyć.

Strach przed przejęciem sesji, włamem hackiem i jeogo jako takie "wykonanie", przypomina amerykańskie filmy o hakcerach, czyli coś co dzieje sie na filmie a jest prawie nie do wykonania w rzeczywistości...

 

Rób tak żeby było proste i sprawnie działało, na samym końcu... czyli potem zajmij sie tego udoskonalaniem.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

dobra :) te czesc juz mam

 

http://szymon.sytes.net/dyplom/index.php

 

login: test

pass: test

 

To jest uzytkownik bez prawa admina. Po nadaniu prawa admina pojawia sie jeszce dodatkowo opcja rejestrowania nowych userow po zalogowaniu :).

 

Teraz mma inny problem :>.

 

Wlasciwie prosilbym was tylko o propozycje rozwaizania. Chodzi o to ze Ci uzytkownicy to maja byc uczniowie, kazdemu z nich musze przyporządkowac w bazie oceny z roznych przedmiotów oraz plan zajec w zaleznosci od tego w jakiej jest klasie, czy na jakim kierunku (to juz jest wyszczegolnione przy nazwie usera w bazie jako numer 1 - technik informatyk 2 - co innego 3 co innego itd...). Stworzylem 3 tabele

 

CREATE TABLE uczen(  id VARCHAR(100) NOT NULL PRIMARY KEY,  id_uczen VARCHAR(20) NOT NULL,  login VARCHAR(20) NOT NULL,  haslo VARCHAR(32) NOT NULL,  imie VARCHAR(40) NOT NULL,  nazwisko VARCHAR(40) NOT NULL,  email VARCHAR(100) NOT NULL,  kierunek TINYINT NOT NULL,  data DATETIME NOT NULL,  administrator TINYINT NOT NULL)");CREATE TABLE oceny(  id VARCHAR(100) NOT NULL PRIMARY KEY,  id_uczen VARCHAR(20) NOT NULL,  id_przedmiot VARCHAR(30) NOT NULL,  ocena TINYINT NOT NULL)");CREATE TABLE przedmioty(  id VARCHAR(100) NOT NULL PRIMARY KEY,  dzien VARCHAR(15) NOT NULL,  godz_od VARCHAR(10) NOT NULL,  godz_do VARCHAR(10) NOT NULL,  przedmiot VARCHAR(20) NOT NULL,  kierunek VARCHAR(10) NOT NULL)");

Ktos ma pomysl jak to powiazac? :D :) Niestety mialem malo stycznosci z bazami i nadal jeszcze nie do konca rozumiem ich dzialanie.... mam nadzieje ze po podpowiedziach zrozumiem cos wiecej :D ...dzieki z gory.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No klucze obce w php raczej kuleją , więc do powiązania tego raczej wykorzystaj php , ale takie porównywanie będzie średnio złożone w tym przypadku. Ale rozwiązanie tutaj sie samo nasuwa , popatrz na nazwy w tabeli oceny takie jak :

 

id_uczen

id_przedmiot

 

ma ona dwie flagi id ucznia i id przedmiotu.

Czyli dodawanie ocen uczniowi będzie polegało na dodaniu rekordu do tej tabeli albo jego modyfikacji gdzie trzeba będzie okręślić flagi jaki to uczeń i z jakiego przedmiotu jest ocena.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...