Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Bezpieczne logowanie
Forum PHP.pl > Forum > PHP
UNK
Witam chciałbym się zapytać czy takie zapytania jak podam poniżej są dobrze napisane, żeby uniemożliwić ewentualny atak.

1)
Logowanie (wyciąłem stąd wszystkie niepotrzebne rzeczy), przed wysłaniem formularza hasło jest dodatkowo hashowane.
  1. <?php
  2. $q1 = "SELECT * FROM user WHERE login = '".addslashes($_POST['name'])."' LIMIT 1;";
  3. if ( ($r1 = $mysql->sql_query($q1)) )
  4. {
  5. if ( !$mysql->sql_numrows($r1) )
  6. {
  7. //brak uzytkownika w bazie
  8. }
  9. else
  10. {
  11. while ( $row = $mysql->sql_fetchrow($r1) )
  12. {
  13. if ( $row['pass'] == md5(sha1($_POST['pass'])) )
  14. {
  15. if ( $row['badlogin'] < 3 and ( !$error ) )
  16. {
  17. //ustanowienie sesji, dodanie informacji o logowaniu i inne
  18. }
  19. }
  20. }
  21. }
  22. }
  23. ?>

W sesji m.i. ustanawiam zmienną login i id ($_SESSION['login'] oczywiście winksmiley.jpg ), które później wykorzystuje do innych zapytań.


2)
Używam AJAX'a i jedynym sposobem na razie który znalazłem na przekazanie sesji to:
  1. <?php
  2. if ( @$_COOKIE['PHPSESSID'] )
  3. {
  4. session_id($_COOKIE['PHPSESSID']);
  5. if (!isset($_SESSION)) session_start();
  6. }
  7. ?>


Nie wiem na ile jest to bezpieczne. Jedyne co wiem to to, że ciasteczko nie jest zapisywane do pliku i zdaję się że jest przechowywane w pamięci (jednak nie wiem jak to wszystko działa i nie wiem na ile można temu ufać).


3)
  1. <?php
  2. $q = "UPDATE user SET pass = '".md5(sha1($_POST['haslo2']))."' WHERE login = '".$_SESSION['login']."'; ";
  3. ?>


To jest zapytania z pliku AJAX'owego więc jeśli da się podszyć pod tamte ciasteczko to także dowolna osoba będzie mogła komuś zmienić hasło (?)
Tutaj tak jak wcześniej hasło jest hashowane dodatkowo przed wysłaniem.


Do wszystkiego dodam że użytkownik ma unikalny login (ale to raczej rzecz oczywista). I jak już wcześniej przeczytałem, a również i zauważyłem hasło może składać się z dowolnych znaków, ponieważ i tak jest hashowane.

To by było na tyle z moich pytań. Z góry dziękuję za odpowiedź i krytykę.
eai
Ja przed przekazaniem loginu sprawdzam czy jest poprawny (wyrazenie reguralne eliminujace niedozwolone znaki) wtedy przekazuje do zapytania.
Haslo koduje na dwa razy. Jak wiadomo md5 mozna zlamac metoda BruteForce ale jesli zrobimy np $haslo = md5($password) . md5(sha1($password) . crc32($password)); raczej ciezko to recznie odkodowac. I w takiej postaci mozna bezpiecznie trzymac w Cookies (jesli wlaczamy opcje autologin). Mozna zrobic opcje ze po 3 nie udanych probach logowania blokujemy dostep z tego IP + Cookies na godzine. Po 10 probach blokujemy na 24h itd.
UNK
O loginie w sumie wpadłem dzisiaj rano, a raczej przypomniało mi się że zapomniałem dodać sprawdzania poprawności (tak jak mówiłeś wyrażenia regularne).
Co do hasła nie wpadłem na taki pomysł aby szyfrowanie zrobić kilka razy, bardziej mi pasuje mój sposób (kilka razy szyfrowanie przed i po wysłaniu (tutaj tylko przykład) i użytkownik będzie jedynie wiedział jak jest hashowane hasło przed wysłaniem (js) ale na serwerze już nie wie i będzie mógł mieć problem, może że trafi na (nie pamiętam jak się to dokładnie nazywało) hash colision.
O tym nie zapomniałem, konto po 3 nieudanych próbach blokowane jest na 1h potem jest odblokowane i ma kolejne próby (nie robiłem już na cały dzień tongue.gif chciałem na początku ale stwierdziłem że mi się nie chce tongue.gif)

Do tego wszystkiego na początek każdy będzie miał dostęp do swojego konta tylko ze swojego ip (bo to jest tak że każdy w sumie już swoje 'konto' ma w którym jest wpisane ip jego komputera i ono będzie zawsze takie jakie będzie miał na komputerze, nie ma możliwości aby te ip się różniły) jednak użytkownik będzie mógł dodać sobie ip na które zezwoli lub zabroni dostępu.

Zrobiłem również logowanie wszelkich zapytań, więc jeśli jakiś użytkownik będzie chciał coś pisać z adresu albo przez fake form to się o tym dowiem przeglądając logi (tak mam tego świadomość że przy ~1000 userach przeglądanie takich logów będzie udręką tongue.gif)
dr_bonzo
A co z ludzmi uzywajacymi neostrady? Praktycznie nie maja mozliwosci dodania innych IP (musieli by dodacwszystkie). Ajak sie rozlacza przed dodaniem IPkow to mogila.
nospor
Pragne zauwazyc, ze topic byl o Sql Injection, a walenie IP, ciastek, podwojnych hashy, nie ma zadnego związku z problemem. Nie robmy juz wiekszego smietnika. POsty wydzielam do odzielnego watku
eai
Co do hashu nie zrozumiales mnie.

Zobacz że praktycznie nie ma znaczenia ile razy wykonasz szyfrowanie typu:

  1. <?php
  2. $haslo = md5(sha1(md5(crc32($haslo))));
  3. ?>


To i tak dostajesz ciag 32 znakowy.

Natomiast jesli zrobisz :
  1. <?php
  2. $haslo = md5($haslo) . md5(md5(crc32($haslo)));
  3. ?>

Dostaniesz ciag 64 znakowy.

Ciag 64 znakowy jest trudniejszy do zlamania niz 32 znakowy.
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.