Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Czy jest to wystarczające zabezpieczenie? - autoryzacja
Forum PHP.pl > Forum > Przedszkole
b_chmura
Witam

Chciałbym się zapytać was ludzi z doświadczeniem i pomysłem czy takie zabezpieczenie jest wystarczające:
  1. <?php
  2. //logowanie - jeśli login i hasło są poprawne tworzy się sesja zakodowanego przez md5 loginu 
    i hasla
  3. function loguj($login, $pass) 
  4. {
  5. $spr = mysql_query("SELECT * FROM `USER` WHERE `login` = 'login' AND `haslo` = '$pass'" LIMIT 0,1);
  6.  
  7. if(mysql_num_rows($spr) == 1)
  8. {
  9. $_SESSION['login'] = md5($login.$pass);
  10. return true;
  11. }
  12. else
  13. {
  14. return false;
  15. }
  16. }
  17. //sprawdzanie czy user jest zalogowany - jeśli dane wyciągnięte i zakodowane przez md5 zgadzają sie z sesją wszystko jes
    t ok
  18. function spr_usr()
  19. {
  20. $query = mysql_query("SELECT * FROM `USER` WHERE `login` = '$login' AND `haslo` = '$pass'");
  21.  
  22. while($user = mysql_fetch_array($query))
  23. {
  24. if(md5($user['login'].$user['haslo']) = $_SESSION['login'])
  25. {
  26. return true;
  27. }
  28. else
  29. {
  30. return false;
  31. }
  32. }
  33. }
  34. ?>

przejdzie to?
cornholio666
Tu chyba masz błąd przy 'login'

  1. <?php
  2. $spr = mysql_query("SELECT * FROM `USER` WHERE `login` = 'login' AND `haslo` = '$pass'" LIMIT 0,1);
  3. ?>


Do czego to służy:

  1. <?php
  2. $_SESSION['login'] = md5($login.$pass);
  3. ?>


Chyba dość niewydajne:

  1. <?php
  2. if(md5($user['login'].$user['haslo']) = $_SESSION['login'])
  3. ?>


Po co az 2 zapytania ?
b_chmura
ad1
tak powinno być `login` = '$login'

ad2
Przypisuje sesji "login" wartość

ad3
powinno być:
  1. <?php
  2. if(md5($user['login'].$user['haslo']) == $_SESSION['login'])
  3. ?>



ad4
bo są to osobne funkcje
Puciek
Ale nie wyjasniles po jaka cholere dane do sesji cisniesz w md5.
Dalej, skąd sie bierze $login i $pass ? Pobierasz je z $_POST ? z $_GET ? z maszyny losujacej ? Czy poprostu w pelni radosnie jedziesz na register_globals ?
Stringi lepiej robic apostrofami, czyli
  1. <?php
  2. mysql_query( 'SELECT * FROM `USER` WHERE `login` = "'.$login.'" AND `haslo` = "'.$pass.'" LIMIT 0,1 ');
  3. ?>
syntax
pakowanie hash'a do sesji jest troche bez sensu, ja bym to wszytsko zrobil w jednej funkcji.
cornholio666
Cytat
ad4
bo są to osobne funkcje


Po co ci aż dwa zapytania żeby sprawdzic czy uzytkownik istnieje? nie da sie jednym ?

Tutaj w pętli haszujesz login i haslo, czyli jak baza bedzie miala 100000 userów to troche niewydajne bedzie.

  1. <?php
  2. if(md5($user['login'].$user['haslo']) == $_SESSION['login'])
  3. ?>




Z kodu wynika ze trzymasz hasło w bazie w postaci jawnej a to duzy błąd
b_chmura
a czy w ten sposób odpowiednio sie zabezpieczę?

  1. <?php
  2. function check_user($login, $pass)
  3. {
  4. if(empty($_SESSION['login']))
  5. {
  6. if(empty($login) OR empty($pass))
  7. {
  8. echo 'Nie podałeś Loginu i/lub Nicka';
  9. return false;
  10. }
  11. else
  12. {
  13. $dane = mysql_query("SELECT * FROM `USER` WHERE `login` = '".$login."' AND `haslo` = '".$pass."' LIMIT 0, 1" );
  14.  
  15. if(mysql_num_rows($dane) == 1)
  16. {
  17. $_SESSION['login'] = 'zalogowany';
  18.  
  19. echo $login.' poprawnie sie zalogował';
  20. return true;
  21. }
  22. else
  23. {
  24. echo 'Login i/lub Hasło są nieprawidłowe!';
  25. return false;
  26. }
  27. }
  28. }
  29. else
  30. {
  31. return true;
  32. }
  33. }
  34. ?>


zmienna $login i $pass pobierane są z formularza.
cornholio666
  1. <?php
  2. if(!isset($_SESSION['login']){
  3.  $_SESSION['login'] = false;
  4. }
  5.  
  6. function check_user($login, $pass)
  7. {
  8.  
  9.  
  10. if(empty($login) OR empty($pass))
  11. {
  12. echo 'Nie podałeś Loginu i/lub Nicka';
  13. return false;
  14. }
  15. else
  16. {
  17. $login = mysql_escape_string($login);
  18. $pass = md5($pass);
  19.  
  20. $dane = mysql_query("SELECT * FROM `USER` WHERE `login` = '".$login."' AND `haslo` = '".$pass."' LIMIT 0, 1" );
  21.  
  22. if(mysql_num_rows($dane) == 1)
  23. {
  24. $_SESSION['login'] = true;
  25.  
  26. echo $login.' poprawnie sie zalogował';
  27. return true;
  28. }
  29. else
  30. {
  31. echo 'Login i/lub Hasło są nieprawidłowe!';
  32. return false;
  33. }
  34.  
  35. }
  36.  
  37. }
  38. ?>


mniej wiecej...
b_chmura
a jakie jest prawdopodobieństwo ze ktoś się "włamie" nie posiadając poprawnych danych ( w tym wypadku)
cornholio666
Przeczytaj to http://forum.php.pl/index.php?showtopic=23258

to http://www.gajdaw.pl/varia/xss.html

Przetestuj skrypt
erix
Co do danych w sesji: nie musisz trzymać danych zahaszowanych w sesji, ale lepiej, jeśli katalog z danymi przeniesiesz w "niepubliczne" miejsce (bo domyślnie /tmp).

No i obowiązkowo to, o czym cornholio666 wspomniał.
templar
Cytat(b_chmura @ 11.09.2007, 14:03:56 ) *
Witam

Chciałbym się zapytać was ludzi z doświadczeniem i pomysłem czy takie zabezpieczenie jest wystarczające:
  1. <?php
  2. //logowanie - jeśli login i hasło są poprawne tworzy się sesja zakodowanego przez md5 loginu 
    i hasla
  3. function loguj($login, $pass) 
  4. {
  5. $spr = mysql_query("SELECT * FROM `USER` WHERE `login` = 'login' AND `haslo` = '$pass'" LIMIT 0,1);
  6.  
  7. if(mysql_num_rows($spr) == 1)
  8. {
  9. $_SESSION['login'] = md5($login.$pass);
  10. return true;
  11. }
  12. else
  13. {
  14. return false;
  15. }
  16. }
  17. //sprawdzanie czy user jest zalogowany - jeśli dane wyciągnięte i zakodowane przez md5 zgadzają sie z sesją wszystko jes
    t ok
  18. function spr_usr()
  19. {
  20. $query = mysql_query("SELECT * FROM `USER` WHERE `login` = '$login' AND `haslo` = '$pass'");
  21.  
  22. while($user = mysql_fetch_array($query))
  23. {
  24. if(md5($user['login'].$user['haslo']) = $_SESSION['login'])
  25. {
  26. return true;
  27. }
  28. else
  29. {
  30. return false;
  31. }
  32. }
  33. }
  34. ?>

przejdzie to?


Przed:

  1. <?php
  2. $spr = mysql_query("SELECT * FROM `USER` WHERE `login` = 'login' AND `haslo` = '$pass'" LIMIT 0,1);
  3. ?>


Zapodałbym:

$login = str_replace("'", '', $login);
$pass = str_replace("'", '', $pass);

Nie ma co się bawić addslashes'ami i innymi badziewiami, lepiej po prostu wyciąć ten apostrof w cholerę - tak jest najbezpieczniej.
I najlepiej robić to wszędzie tam, gdzie zmienna bierze udział w zapytaniu MySQL - chyba, że te apostrofy są potrzebne, wtedy lepiej
zastąpić je funkcją htmlentities() i dopiero zapisywać do bazy.

Pozdrawiam.
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.