Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Bezpieczne logowanie
UNK
post
Post #1





Grupa: Zarejestrowani
Postów: 93
Pomógł: 5
Dołączył: 30.04.2006
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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ę.

Ten post edytował UNK 17.10.2006, 09:27:41
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
eai
post
Post #2





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
UNK
post
Post #3





Grupa: Zarejestrowani
Postów: 93
Pomógł: 5
Dołączył: 30.04.2006
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


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ń (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) chciałem na początku ale stwierdziłem że mi się nie chce (IMG:http://forum.php.pl/style_emoticons/default/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ą (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) )
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


A co z ludzmi uzywajacymi neostrady? Praktycznie nie maja mozliwosci dodania innych IP (musieli by dodacwszystkie). Ajak sie rozlacza przed dodaniem IPkow to mogila.
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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
Go to the top of the page
+Quote Post
eai
post
Post #6





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 17:21