Witam,
Jest sobie stronka na ktorej klienci mogą wyszukiwać swoje faktury , robić raporty, strona jest na linuxowym serwie WWW a baza na innym serwie w sieci lokalnej. Teraz kazdy uzytkownik ma użytkownika i hasło przydzielone przez firme.
Jak powinno wygladac bezpieczne logowanie?
Ja wczesniej zrobilem taki mechanizm ze user i haslo przechowywane jest w tabeli users (mysql) oczywiscie haslo jest zachaszowane. Teraz po kliknieciu loguj sprawdzanie jest czy jest taki user w bazie i czy zahaszowane haslo jest takie samo jak zahaszowane w tabeli. Jezeli tak to zmienna sesyjna np LOGIN przyjmuje wartosc usera i wchodzi do serwisua jezeli nie to wyjazd.
Strona jest zrobiona tak ze jest sobie plik main.php ktory ma w sobie switcha i dolacza odpowiednie pliki php gdzie na poczatku kazdego pliku jest sprawdzenie wartosci LOGIN i czy jest OK.
Chodzi mi glownie o bezpieczenstwo bazy, zeby nie namieszał ktos, cos sie jeszcze zabezpiecza dodatkwoo, czy po stronie serwa muszą byc odpowiednie zabezpiecznie ?
Dzieki za porade i prosze nie dawac linkow do google :)
register_globals = off
i filtruj pola formularza... nie przepuszczaj znakow typu ', ", -, ...
Ew. mysql_escape_string().
Patyk napisał(a)
Ew. mysql_escape_string().
A coś dokladniej ? Po co Dlaczego ?
zeby sie zabezpieczyc prze takiego typu loginami, np:
' or 1=1 --
ssnake napisał(a)
zeby sie zabezpieczyc prze takiego typu loginami, np:
' or 1=1 --
Ale dlaczego jak ktos wpisze taki tekst to jest to niebezpieczne ? Co sie moze stac ? Sory za męki :)
moze sie wykonac zapytanie
select * from tab where login='' or 1=1 --
ssnake napisał(a)
moze sie wykonac zapytanie
select * from tab where login='' or 1=1 --
Jezeli gosc wpisuje 2 pola, user i haslo a w bazie trzymany jest user i zahaszowane haslo : password(haslo) to raczej chyba nie ma szans zeby tak wszedl.
To moze sprobujecie sie wlamac tutaj:
http://www.mg.4en.com.pl/magazyn/
Zapraszam :)
Glina napisał(a)
ssnake napisał(a)
moze sie wykonac zapytanie
select * from tab where login='' or 1=1 --Jezeli gosc wpisuje 2 pola, user i haslo a w bazie trzymany jest user i zahaszowane haslo : password(haslo) to raczej chyba nie ma szans zeby tak wszedl.
To moze sprobujecie sie wlamac tutaj:
http://www.mg.4en.com.pl/magazyn/Zapraszam :)
o jej.. to jest tylko przykład, ssnake pisząc posta nie znał przeciez struktury twojej bazy danych. Poczytaj o atakach typu SQL Injection bo o nie chodzi. Jeżeli zabezpieczysz sie przed nimi i wyłaczysz register_globals to jesteś względnie bezpieczny.
Kooba napisał(a)
o jej.. to jest tylko przykład, ssnake pisząc posta nie znał przeciez struktury twojej bazy danych. Poczytaj o atakach typu SQL Injection bo o nie chodzi. Jeżeli zabezpieczysz sie przed nimi i wyłaczysz register_globals to jesteś względnie bezpieczny.
No wiem wiem, dzieki za odp poczytam :)
Jezeli gosc wpisuje 2 pola, user i haslo a w bazie trzymany jest user i zahaszowane haslo : password(haslo) to raczej chyba nie ma szans zeby tak wszedl.
To że masz ileśtam pól w bazie danych, lub że hasła są zaszyfrowane nie ma nic do rzeczy. I tak da się zastosować wymuszenie poprawności. Czyli np. gdy do pola login wpiszę:
cos' OR 1=1)--
to zapytanie do bazy danych będzie wyglądało tak:
<b>select * from user_m where (user='cos' OR 1=1)-- </b><i>' && haslo=password(''))</i>
Wszystko co znajduje się po -- jest komentarzem, więc tak na prawdę twoje zapytanie to jest tylko ten pogrubiony tekst. Dalej już się powinieneś domyśleć co się stanie, jeśli jedno z wyrażeń przy OR jest prawdziwe ;]
mysql_escape_string() wstawia backslasha przed znaki apostrofu (i kilka innych), przez co jest on interpretowany jako najnormalniejszy w świecie znak apostrofu, a nie znak końca danych tekstowych
.
To moze sprobujecie sie wlamac tutaj:
http://www.mg.4en.com.pl/magazyn/
Wszlkie zabezpieczenia na serwerze tracą trochę sens jesli ktoś pzrechwyci hasło "po drodze". Do swoich zabezpieczeń spróbUj dodać połączenie szyfrowane.
pozdrawiam
Do Autora postu. Czy zdajesz sobie sprawę, że twój przykładowy link do serwisu jest nadal nieodporny na cos' OR 1=1)-- ??