Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Rejestracja użytkowników
tadeurz
post
Post #1





Grupa: Zarejestrowani
Postów: 70
Pomógł: 1
Dołączył: 25.04.2009

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


Napisałem sobie skrypt który zapisuje mi użytkowników do bazy danych.Zastanawiam się nad jego bezpieczeństwem moglibyście rzucić okiem ?

Proszę, bo naczytałem się w internecie: zawsze addslashed i htmlspecialchars(), moża też spotkać coś takiego :
$email = htmlspecialchars(stripslashes(strip_tags(trim($_POST["email"]))), ENT_QUOTES); <- tworzenie takiego czegoś dla hasła kompletnie go zmieni.

Przeglądałem i zastanawiałem się nad moim kodem wiele razy, według mnie nie ma żadnej luki.Ale nie daje mi to spokoju.

  1. if( $this->ajax ){
  2. $email = $_POST['email'];
  3. $password = $_POST['password'];
  4. $recaptcha = $_POST['recaptcha'];
  5. $challenge = $_POST['challenge'];
  6.  
  7. $recaptchaOK = false;
  8. if( !empty($recaptcha) && !empty($challenge) ){
  9. require_once('phpClass/recaptcha.php');
  10. $privatekey = '6Lfn8tsSAAAAALtc6Ny******************';
  11. $resp = recaptcha_check_answer ($privatekey,$_SERVER["REMOTE_ADDR"],$challenge,$recaptcha);
  12. $recaptchaOK = ( $resp->is_valid ) ? true : false ;
  13. }
  14.  
  15. $passwordOK = false;
  16. if( !empty($password) && strlen($password) < 40 ){
  17. require_once('phpClass/phpass.php');
  18. $hasher = new PasswordHash(8, TRUE);
  19. $password = $hasher->HashPassword($password);
  20. $passwordOK = ( strlen($password) >= 20 ) ? true : false ;
  21. }
  22.  
  23. $emailOK = false;
  24. if( !empty($email) ){
  25. $emailOK = ( preg_match('/^[0-9a-zA-Z_.-]+@[0-9a-zA-Z.-]+\.[a-zA-Z]{2,3}$/', $email) === 1 ) ? true : false ;
  26. $emailTaken = sql::qq('SELECT `id` FROM `user` WHERE `email`=? ','s',array($email));
  27. $emailTaken = ( $emailTaken ) ? true : false ;
  28. }
  29.  
  30. if( !$emailTaken && $emailOK && $passwordOK && $recaptchaOK ){
  31. $sqlR = sql::qq('INSERT INTO `user` (`email`,`password`) VALUES (?,?)','ss',array($email,$password));
  32. $this->body = array('status'=>true);
  33. }else{
  34. if( !$recaptchaOK ) $error['wrongRecaptcha']= $this->l('wrongRecaptcha');
  35. if( $emailTaken ) $error['takenEmail']= $this->l('takenEmail');
  36. if( !$emailOK ) $error['wrongEmail']= $this->l('wrongEmail');
  37. if( !$passwordOK ) $error['wrongPassword']=$this->l('wrongPassword');
  38. $this->body = array('status'=>false,'info'=>$error);
  39. }
  40. }else{
  41. error::NotAJAX();
  42. }


/---------------------------------
przepraszm za dziwne tab'y. Ten edytor coś wyzmieniał mi dlatego jest nieczytelnie.

Ten post edytował tadeurz 1.02.2013, 16:51:09
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
tadeurz
post
Post #2





Grupa: Zarejestrowani
Postów: 70
Pomógł: 1
Dołączył: 25.04.2009

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


strlen($password) < 40 – wymaga aby hasło było mniejsze od 40 znaków, bo hash’owanie dłuższych hasłem może obciążać serwer.
Sunny Singh w swoim artykule podaje max 72, ja stwierdziłem że mam to sens i jest logiczne. Dlatego poszedłem dalej i ograniczyłem do 40.Nikt przy zdrowych zmysłach dłuższych hasłem nie stosuje, no chyba że ma złe intencje. Linika ma tylko chronić serwer, nie jest walidacją.
http://sunnyis.me/blog/secure-passwords/

strlen($password) >= 20 <- sprawdza czy hash’owanie przebiegło bez problemu. Nie powiem Ci jaki problem mógł wystąpić podczas hash’owania. Nigdy nic nie wiadomo. Hash nigdy nie będzie krótszy od 20 znaków. Linijka wyłapująca ewentualny błąd przy hash’owaniu, nie jest walidacją.
Cytat
This uses the fact that the shortest valid password hash encoding string that phpass can currently return is 20 characters long (this is the case for CRYPT_EXT_DES, whereas other hash types use even longer encoding strings). fail() is a custom function that we'll use in our sample program.

http://www.openwall.com/articles/PHP-Users-Passwords

Obsługa błędów:
O tym jakie hasło a być użytkownik jest informowany przy wypełnianiu formularza. Jest to też sprawdzane przy pomocy JS, jeżeli coś nie przejdzie walidacji, formularz nie jest nawet wysyłany.
(Wiem ze walidacja po stronie użytkownika jest niczym .Bo każdy w temacie ominie formularz i wyśle bezpośrednio do skryptu PHP. Walidacja w JS jest dla użytkowników którzy nie mają złych intencji, chcą się tylko zalogować. Formularz który na bieżąco sprawdza poprawność danych jest przyjemny dla odwiedzających(tych dobrych) ).
Dla informacji jedyne czego wymagam od użytkowników to: długość hasła nie może być mniejsza od 7 znaków. Jest to jedyna restrykcja. Nie widzę możliwości aby jakiś ciąg znaków mógł zaszkodzić mojemu skryptowi (np: ‘\złośliwy kod , %00złośliwy kod ) wszystko podejrzane zostanie haszowane i będzie hasłem.

Kończąc: jak ktoś nie zauważył już mamy błąd:D Nigdzie nie sprawdzam czy email rzeczywiście jest dłuższy od 7 znaków .Musze dodać warunek : strlen($password) >= 7 (nie może być mniejsza ! może być równa).
timon27 dzieki za odpowiedz.

---------------------------------------------------------------------------
tylko po co mi tutaj isset ?
jak zmienne $_POST będą puste zwrócą NULL. Jak wskazuje manual PHP empty(NULL) -> true, więc wstawianie tutaj warunku z isset jest bezcelowe. Z manuala:
Cytat
That means empty() is essentially the concise equivalent to !isset($var) || $var == false.

Cytat
The following things are considered to be empty:

NULL


Nie wiedziałem. Wyrażenie regularne skopiowałem z jakiejś strony która zawierała listę innych przydatnych regexp. Po przeanalizowaniu wydała mi się dobra. Znalazłem ciekawy artykuł na temat walidacji :
http://www.linuxjournal.com/article/9585
Przypadek 2 jest podobny do mojego wyrażenia podejrzewam że wspólne źródło. Nie chce iść na tak daleki kompromis jak w artykule dlatego zmieniam na:
'/^[0-9a-z _.-]+@[0-9a-z]+\.[a-z]{2,3}$/' <- teraz powinno być idealnie.

!*! dzięki za odpowiedz
Go to the top of the page
+Quote Post

Posty w temacie


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: 17.10.2025 - 18:32