Andrzej1002
12.03.2010, 22:07:02
Logowanie KIERUNKOWE z "dziedziczeniem"

?
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
<?php
die ("Nie można poł±czyć się z MySQL"); die ("Nie można poł±czyć się z baz± DANYCH");
$wynik = mysql_query ("SELECT * FROM userzy WHERE NrUsera = 72 ORDER BY id;") or
die ("bł±d w pytaniu");
$Wzrost = $rekord['Wzrost'];
$KolorOczu = $rekord['KolorOczu'];
$Waga = $rekord['Waga'];
print "<tr><td>$Wzrost</td><td>$KolorOczu</td><td>$Waga</td></tr>\n"; }
?>
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
13.03.2010, 10:34:13
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
13.03.2010, 18:30:46
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
13.03.2010, 21:33:22
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

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
13.03.2010, 22:53:27
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
13.03.2010, 23:10:51
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

-------------
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
13.03.2010, 23:21:51
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.
if(isset($_POST['wyslij'])) { $haslo = md5($_POST['haslo'].$sol); }
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.
if(isset($_POST['wyslij'])) { $sol1 = 'super_tajne_haslo';
$haslo = md5($sol1.$_POST['haslo'].$sol2); //np. md5(super_tajne_haslomojehaslo1268692774) }
d3f3nd3r
13.03.2010, 23:43:51
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
14.03.2010, 00:04:07
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
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ć
d3f3nd3r
14.03.2010, 00:13:49
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ć

W sumie to od dzisiaj zaczynam solić

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
14.03.2010, 00:23:51
<?php
//Polaczenie z baza danych
if(isset($_POST['submit'])) { //Sprawdzenie czy zostal wyslany formularz $q = mysql_fetch_row(mysql_query("SELECT NrId FROM haselka WHERE Login = ".$_POST['login']." AND Haslo = `".$_POST['haslo']."`")); if(!isset($q[0])) { // Jesli baza nie zwrocila zadnego wyniku tzn ze zle cos zrobil user. echo 'Zle haslo lub login lub oba'; }
else header("Location: konto.php?id=$q[0]"); // Jesli poprawne dane to przekierowuje do pliku konto.php?id=NrId } ?>
<html><body>
<form action="index.php" method="post">
Login:<input type="text" name="login" value=""><br />
Haslo:<input type="password" name="haslo" value=""><br />
<input type="submit" name="submit" value="Wyslij"></form>
</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
14.03.2010, 00:32:30
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
14.03.2010, 11:17:32
@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
14.03.2010, 13:26:26
Bo widzisz kuzdo, niektórzy sie zabezpieczają inaczej niż zwyczajowo

Informacje pewne mają w jednej bazie, ale już reszte w innej bazie

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

Wszystko to tylko kwestia pomysłowości programisty i jego "artyzmu" w panowaniu nad kodem.
Andrzej1002
20.03.2010, 20:31:55
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.