Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Logowanie KIERUNKOWE z "dziedziczeniem" ?
Forum PHP.pl > Forum > Przedszkole
Andrzej1002
Logowanie KIERUNKOWE z "dziedziczeniem" questionmark.gif?


Założenia:

Jest ok. 80 użytkowników wzajemnie nie mogący poznawać informacji obcych. Jest stworzonych dla nich ok. 80 stron tylko z ICH informacjami. Strony są identyczne i wyświetlają dane zaczerpnięte z bazy danych MySQL o strukturze podobnej do:

userzy

NrUsera----Wzrost----KolorOczu----Waga
50-----------181---------czarne--------89
23-----------169---------zielone--------71
72-----------192---------fiolkowe-------97


  1.  
  2. <?php
  3.  
  4. mysql_connect ("127.0.0.1", "root", "krasnal") or
  5. die ("Nie można poł&plusmn;czyć się z MySQL");
  6. mysql_select_db ("bazzzza") or
  7. die ("Nie można poł&plusmn;czyć się z baz&plusmn; DANYCH");
  8.  
  9.  
  10. $wynik = mysql_query ("SELECT * FROM userzy WHERE NrUsera = 72 ORDER BY id;") or
  11. die ("bł&plusmn;d w pytaniu");
  12.  
  13. print "<table>";
  14.  
  15. while ($rekord = mysql_fetch_assoc ($wynik)) {
  16. $Wzrost = $rekord['Wzrost'];
  17. $KolorOczu = $rekord['KolorOczu'];
  18. $Waga = $rekord['Waga'];
  19.  
  20. print "<tr><td>$Wzrost</td><td>$KolorOczu</td><td>$Waga</td></tr>\n";
  21. }
  22. print "</table>";
  23.  
  24. ?>


Chodzi o stworzenie bardzo PROSTEGO formularza logowania w którym LOGIN odpowiadałby numerowi Usera (NrUsera) [zgodność hasła dla tego loginu sprawdzona ma być w bazie MySQL] i numer tego USERA wklejony byłby do SELECT'u w miejsce "NrUsera = 72" -- (w tym przypadku wartość "72"). Umożliwiłoby to stworzenie jednej strony dla moich ok. 80 użytkowników. Warunek: w jednym czasie może wejść trzech lub nawet więcej użytkownikow...

Jeżeli ktoś ma genialny (i prosty) pomysł to będe wdzięczny.

And
kipero
Ogólna idea jest prosta - robisz formularz, gdzie user wpisuje swój numer i hasło, wysyłasz go metodą POST do tego skryptu, który już masz, sprawdzasz w bazie czy się zgadza numer z hasłem i jeśli tak to pobierasz dane z bazy, a jeśli nie wyświetlasz odpowiedni komunikat.
Andrzej1002
Dzięki za sugestię ale głupia sprawa -coś mi to nie wychodzi.... albo skrypt robi się gigantyczny albo wszystko się sypie.

Mam bazę z hasłami:


haselka

NrId----NrUsera---Login---Haslo
0--------23--------23------aaaa
1--------72--------72------bbbb
2--------50--------50------cccc

i nie wiem jak napisać krótki MINIskrypt (ale w miarę bezpieczny) lugujący... i przekacujący nr (tu "72") do strony j.w.

Jeżeli ktoś mi pomoże będę wdzięczny..
thek
Ech... Przy logowaniu Ty sprawdzasz numer usera czy login i hasło? Bo jak dla mnie robisz to pierwsze, a chcesz robić tak naprawdę to drugie winksmiley.jpg W formularzu podajesz login i hasło, które sprawdzasz czy istnieją w bazie i zgadzają się. Jeśli tak to zwracasz ów id_usera lub wszystko co tam Ci potrzebne. Co do względów bezpieczeństwa... Jawne przechowywanie haseł uzytkowników (czyli takie, że można je oodczytać) to poważna luka bezpieczeństwa. Poczytaj o hashach, w szczególności sha-1 i md5 oraz "soleniu".
Andrzej1002
Może troche przesadziłem z tym zabezpieczeniem. Potrzeguję formularz logowanie (tylko login i hasla) z którego ten login "72" jakoś przenoszony był do strony jak w temacie na samej górze. Hasło i login są w bazie danych "haselka".

Jak ktoś umie napisać taki miniWzorzec to naprawdę będę wdzięczny....

Pozdrawiam.
d3f3nd3r
Cytat(thek @ 13.03.2010, 21:33:22 ) *
Poczytaj o hashach, w szczególności sha-1 i md5 oraz "soleniu".


Tak się podepnę - ja przetrzymuję w bazie hashe haseł ale zastanawiam się skoro przy obecnych sprzętach idzie rozłożyć kilku literowe hasełko dość szybko to czy nie dobrym wyjściem byłoby przechowywanie hashy zahashowanych haseł tzn md5(md5($haslo)).
Z tego co czytałem sha-1 zostało złamane i nie jest już bezpiecznym algorytmem, a co to "solenie" bo googlarka o Makłowiczu głupoty zwraca smile.gif

-------------
Edit

Przecież thek napisał żeby porównywać nicki i hasła a jak się tak upierasz przy tym 72 to porównaj nick i hasła i wyciąg sobie dodatkowo to id
Kużdo
Solenie to dodanie jakichś losowych lub z góry ustalonych danych do obecnego ciągu znaków, przez co rozszyfrowanie takich danych staje się trudniejsze, a wręcz niemożliwe...

Np.
  1. if(isset($_POST['wyslij'])) {
  2. $sol = time() + 69;
  3. $haslo = md5($_POST['haslo'].$sol);
  4. }


W tej sytuacji sól to suma obecnego czasu w sekundach i liczby 69. Później dołączasz taką wartość do hasła i powstaje np. takie hasło: mojehaslo1268692774 z którego robisz hash md5. Oczywiście możesz robić o wiele bardziej złożone kombinacje np.
  1. if(isset($_POST['wyslij'])) {
  2. $sol1 = 'super_tajne_haslo';
  3. $sol2 = time() + 69;
  4. $haslo = md5($sol1.$_POST['haslo'].$sol2); //np. md5(super_tajne_haslomojehaslo1268692774)
  5. }
d3f3nd3r
Czyli rozumiem że np. w pierwszym wypadku trzeba przechowywać jeszcze dodatkowo w bazie czas wygenerowany (czy odczytany z serwera) w momencie tworzenia hasła lub powiekszonego o 69 ($sol).
Jeśli chodzi o drugi przypadek to trzeba przechowywać $sol1 i $sol2 bo nie byłoby możliwości porównać hashy. Czy tak?
Andrzej1002
Jednak za mądrzy jesteście dla mnie... Szczerze: ja potrzebuję gotowy skrypt (i to niezbyt skomplikowany abym potrafił go przeanalizować) który sprawdziłby zgodność hasla w bazie danych "haselka" i po sprawdzeniu zgodności wywołałby stronę opisaną na samej górze z wstawionym... tym moim loginem np. = "72".

Jak ktoś znajdzie 5 minut czasu to się polecam...
Kużdo
W pierwszym wypadku wystarczy przechowywać w bazie wartość zmiennej $sol przy tworzeniu, w drugim przypadku tylko wartość zmiennej $sol2, bo wartość zmiennej $sol1 jest wpisana na stałe w plik php chyba, że inaczej to rozwiążesz... Ale w takim przypadku jak podałem, to do każdego hasła na początek byłby dodawany tekst "super_tajne_haslo", a na koniec już generowana wartość którą trzeba gdzieś zapisać winksmiley.jpg
d3f3nd3r
Cytat(Andrzej1002 @ 14.03.2010, 00:04:07 ) *
Szczerze: ja potrzebuję gotowy skrypt


Szczerze: na tym forum gotowca nie dostaniesz. Zresztą to są podstawy, które znajdziesz w byle jakim kursie - zapytaj pana google.

Cytat(kuzdo @ 14.03.2010, 00:05:57 ) *
W pierwszym wypadku wystarczy przechowywać w bazie wartość zmiennej $sol przy tworzeniu, w drugim przypadku tylko wartość zmiennej $sol2, bo wartość zmiennej $sol1 jest wpisana na stałe w plik php chyba, że inaczej to rozwiążesz... Ale w takim przypadku jak podałem, to do każdego hasła na początek byłby dodawany tekst "super_tajne_haslo", a na koniec już generowana wartość którą trzeba gdzieś zapisać winksmiley.jpg


W sumie to od dzisiaj zaczynam solić smile.gif bo to co pisałem o hashowaniu hasha to nic nie daje bo jak ktoś będzie sprawdzał hasha z hasha to zajmie tylko 2 razy wiecej czasu i jakieś krótkie hasełko szybko padnie.
Kużdo
  1. <?php
  2. //Polaczenie z baza danych
  3. if(isset($_POST['submit'])) { //Sprawdzenie czy zostal wyslany formularz
  4. $q = mysql_fetch_row(mysql_query("SELECT NrId FROM haselka WHERE Login = ".$_POST['login']." AND Haslo = `".$_POST['haslo']."`"));
  5. if(!isset($q[0])) { // Jesli baza nie zwrocila zadnego wyniku tzn ze zle cos zrobil user.
  6. echo 'Zle haslo lub login lub oba';
  7. die();
  8. }
  9. else header("Location: konto.php?id=$q[0]"); // Jesli poprawne dane to przekierowuje do pliku konto.php?id=NrId
  10. } ?>
  11. <html><body>
  12. <form action="index.php" method="post">
  13. Login:<input type="text" name="login" value=""><br />
  14. Haslo:<input type="password" name="haslo" value=""><br />
  15. <input type="submit" name="submit" value="Wyslij"></form>
  16. </body></html>


Plik zapisujesz jako index.php, a w pliku konto.php musisz mieć funkcje wyświetlające odpowiednie dane na stronie. Do tego powinieneś dołączyć walidację loginu i np. kodowanie hasła, ale z tego co piszesz to widzę, że nie kodujesz w ogóle haseł.
thek
Andrzej. To o czym mówisz to naprawdę podstawy podstaw PHP i SQL. Jeśli na tym etapie sie wywalasz juz to przy trudniejszych zagadnieniach po prostu zaliczysz "zgon programistyczny". Sprawdzenie loginu i hasła poprzez porównanie z bazą to jedne z pierwszych rzeczy jakich ludzie się uczą przy pisaniu portalu. Od ich finezji i zdolności jedynie stopień bezpieczeństwa calego logowania zależy lub bajery dodatkowe jak choćby sprawdzenie dostępności loginu w bazie (o którego mechanizm zresztą choćby dziś miałem pytanie na PW).

@kuzdo. Sól dodatkowa z bazy to niby dodatkowe zabezpieczenie, ale tak naprawdę nie zmienia ona wiele. Czemu? Skoro ktoś wyrwal z bazy hashe, to automatycznie także dobrał się do tych soli i tym samym są one nic nie warte, bo będzie on tę sól dodawał raz z jednej, a raz z drugiej strony hasła do momentu uzyskania dokładnie takiego hasha jaki z bazy wyciągnął. Można mu to jedynie utrudnić jeśli nie dorwał sie do plików w serwisie poprzez to co już dodałeś, czyli kolejna sól, przechowywana choćby w plikach połączenia z bazą, czy ogólnie konfiguracyjnych. Innym rozwiązaniem jest coś, co nazywam "solą dzieloną", bo w sumie nie spotkałem się z taką implementacją soli w skryptach rejestracji. Formalnie wygląda to jak jedna sól, choć działa podobnie jak dwie. O co mi biega? Masz sól w postaci wieloznakowej (może być to jakiś hash) jako jeden ciąg, ale skrypt rejestracji/logowania dzieli go sobie na dwa mniejsze w określonym miejscu i jedną część dokłada jako prefix, a drugą jako postfix.
Kużdo
@thek to co podałem, to tylko przykład, bo stopień trudności powinien już sobie ustawić sam programista... Co do bezpieczeństwa danych w bazie, jeżeli teoretycznie ktoś uzyskał dostęp do hashy, to teoretycznie może dobrać się do każdej tabeli i jej zawartości, więc hasła już mu nawet nie będą potrzebne jeśli dostanie się do innych danych na których mu zależy... Także sprawą priorytetową jest tak zabezpieczyć skrypty i dostęp do bazy danych, żeby nikt niepowołany nie uzyskał do niej dostępu.

Co do dzielenia soli na pół, na to nie wpadłem, ale stosuję trochę podobne zabezpieczenie. Z przodu dodaję liczbę która jest długością hasła, a z tyłu zmienną z bazy która jest wartością time() + XXX. Idąc dalej można napisać takie zabezpieczenie, w którym sól mogłaby być tworzona z złączenia loginu+hasła, ale w formie hasha md5. Później może być liczona długość loginu/hasła (które u mnie mogą mieć tylko 20 znaków) i wynik może być stosowany do rozdzielania soli. Jeżeli wyjdzie 8, to dzielimy sól na pierwsze 8 znaków i resztę. Następnie ta reszta może być dołączana z przodu, a pierwsze 8 znaków z tyłu lub nawet gdzieś w środku... Ale pozostaje pytanie - po co tworzyć takie super zabezpieczenia, skoro można stworzyć o wiele prostsze, których także nie da się złamać... Wystarczy jedna sól z tyłu ciągu + hashowanie md5(sha1(md5($string))); i tego nikt nie złamie... A jeżeli dostanie się do bazy, to po co ma próbować odszyfrować hasła, skoro ma dostęp wszędzie?
thek
Bo widzisz kuzdo, niektórzy sie zabezpieczają inaczej niż zwyczajowo winksmiley.jpg Informacje pewne mają w jednej bazie, ale już reszte w innej bazie winksmiley.jpg Mają więc odseparowane informacje podstawowe od krytycznych. Co z tego, że ktoś dorwie się do jednej części, skoro do drugiej nie podłączy się i nie podejrzy. Zabezpieczanie na różne sposoby w wielu przypadach może urosnąc do poziomu, prawie że, sztuki winksmiley.jpg Wszystko to tylko kwestia pomysłowości programisty i jego "artyzmu" w panowaniu nad kodem.
Andrzej1002
Dzięki serdeczne wszystkim którzy choć trochę pomogli ale i tym którzy mnie zmobilizowali do dalszego szukania. Na innych forach znalazłem kilka gotowców na podstawie ktorych nauczyłem się jak konstruować tego typu mechanizmy. "Posoliłem" i "zaMerDalem na5" zabezpieczeniami i mam nadzieję, że nikt się nie włamie. Problemów miałem trochę z SESJAMI albowiem mój "trzymaciel" stron i bazy danych ma jakieś starsze wersje i nie wszystkie kody są rozumiane...
Odnośnie moich programistycznych zapędów --- to są żadne. Po prostu potrzebowałem zrobić obsługę swoich własnych danych (mała firma produkcyjna) i starałem się zrobić to według własnej wizji. Doszedłem do wniosku, że na moje potrzeby prędzej nauczę się fragmentu PHP dotyczącego logowania, zabezpieczeń, dziedziczenia sesji (zabezpieczonego) - niż wytłumaczę to fachowcom. Na tą skalę co potrzebowałem jest OK. Za tydzień lub dwa przewiduję następny problem i planuję się zwrócić z następnym zapytaniem.
Pozdrawiam i dzięki...
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.