Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Bezpieczne logowanie - lae czy naprawdę takie bezpieczne ?!
Forum PHP.pl > Forum > PHP
kiler129
A więc dzisiaj miałem sporo wolnego czasu więc postanowiłem ze tym razem napiszę cos pożytecznego winksmiley.jpg
Zajrzałem na maila i .... jest tam zlecenie dla mnie na logowanie do wewnętrznej sieci firmowej.

Wymagania jakie postawiono to:

- Oparte na plikach
- Hasła nie mągą być jawnie zapisane w pliku
- Proste do integracji z resztą oskryptowania

Wymyśliłem coś takiego:

register.php
  1. <?
  2. $login = $_POST['login'];
  3. $haslo = $_POST['pwd'];
  4. $haslo2 = $_POST['pwd2'];
  5.  
  6. if(isset($_POST['login']) && isset($_POST['pwd']))
  7. {
  8.  if (file_exists('./user/'.$login.'.php'))
  9. {
  10.  echo 'Taki login juz istnieje !<br>Wróć i wybierz inny';
  11. }
  12. else
  13. {
  14.  $nr = rand (99, 999);
  15.  $haslod = $haslo;
  16.  $haslod .= $nr;
  17.  
  18.  echo $haslod;
  19.  
  20.  $haslo .= "$nr";
  21.  $md5 = md5($haslod);
  22.  $crc32 = crc32($haslod);
  23.  $sha1 = sha1($haslod);
  24.  
  25.  $file = './user/'."$login".'.php'; 
  26.  $fp = fopen($file, "a"); 
  27.  flock($fp, 2); 
  28.  fwrite($fp, '<?'."n");
  29.  fwrite($fp, '$md5 = ''."$md5".'';'."n"); 
  30.  fwrite($fp, '$crc32 = ''."$crc32".'';'."n"); 
  31.  fwrite($fp, '$sha1 = ''."$sha1".'';'."n"); 
  32.  fwrite($fp, '$numer = ''."$nr".'';'."n"); 
  33.  fwrite($fp, '?>'."n");
  34.  flock($fp, 3); 
  35.  fclose($fp);
  36. }
  37.  
  38. }
  39. else
  40. {
  41.  echo '<html><head><meta http-equiv="Content-Language" content="pl">';
  42.  echo '<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2">';
  43.  echo '<title>Rejestracja :: Demo</title></head><body>';
  44.  echo '<form method="POST" action="./register.php">';
  45.  echo '<p>Login <input type="text" name="login" size="20"></p>';
  46.  echo '<p>Hasło <input type="password" name="pwd" size="20"></p>';
  47.  echo '<p>Hasło <input type="password" name="pwd2" size="20"> (Przepisz powyższe jeszce raz)</p>';
  48.  echo '<p><input type="submit" value="Rejstruj"></p>';
  49.  echo '</form></form></body></html>';
  50. }
  51. ?>




login.php
  1. <?
  2. if (isset($_POST['login']) && isset($_POST['pwd'])) 
  3. {
  4.  $login = $_POST['login'];
  5.  $pwdzp = $_POST['pwd'];
  6.  if (file_exists('./user/'.$login.'.php'))
  7.  {
  8.  include './user/'."$login".'.php';
  9.  $hdw = "$pwdzp";
  10.  $hdw .= $numer;
  11.  if(md5($hdw) == $md5 && crc32($hdw) == $crc32 && sha1($hdw) == $sha1)
  12.  {
  13. echo 'OK';
  14.  }
  15.  else
  16.  {
  17. echo 'ZLE HASLO !';
  18.  }
  19.  }
  20.  else
  21.  {
  22.  echo 'Bledny login !';
  23.  }
  24. }
  25. else
  26. {
  27.  echo '<html><head><meta http-equiv="Content-Language" content="pl">';
  28.  echo '<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2">';
  29.  echo '<title>Logowanie :: Demo</title></head><body>';
  30.  echo '<form method="POST" action="./login.php">';
  31.  echo '<p>Login <input type="text" name="login" size="20"></p>';
  32.  echo '<p>Hasło <input type="password" name="pwd" size="20"></p>';
  33.  echo '<p><input type="submit" value="Zaloguj"></p>';
  34.  echo '</form></form></body></html>';
  35. }
  36. ?>



Oparte na 3 sumach kontrolnych winksmiley.jpg
Drugim utrudnieniem jest to że sumy nie są tworzone od hasła ale od hasła i 2-3 cyfrowej liczby biggrin.gif
Nawet jak ktoś zdobędzie jakos hash to i tak sie nie zaloguje nawet jak go rozkoduje winksmiley.jpg
Napewno wielu zmyli zmienna $numer, kazdy normlany pomyśli że to numer usera w systmie tongue.gif


Co o tym myślicie ? Nadaje się ?
Sedziwoj
W register.php masz
  1. <?php
  2. $login = $_POST['login'];
  3. ?>

a gdzie sprawdzenie czy istnieje? Gdzie sprawdzasz co zawiera?
To tyczy się wszystkiego co dostajesz, $_POST można bez trudu sfabrykować.

EDIT lit.
kiler129
To jak proponujesz to weryfikować ?
Wystarczy zostwaic tylko litery ?
bełdzio
Cytat(kiler129 @ 21.04.2007, 22:58:07 ) *
To jak proponujesz to weryfikować ?
Wystarczy zostwaic tylko litery ?

dla loginu tak, dla hasła nie
kiler129
tak ale przeciez mozna by miec login ktos123 iwc to tez nie to.

Jest jakas gotowa klasa ?
woolf864
  1. <?php
  2. $login = preg_replace("/([^sa-zA-Z0-9])/", "", $login);
  3. $pass = preg_replace("/([^sa-zA-Z0-9])/", "", $pass);
  4. ?>


użytkownikowi w loginie i haśle są potrzebne jedynie litery cyfry i puste znaki...
znaki specjalne są mu całkowicie niepotrzebne...
więc myśle że coś takiego będzie w sam raz winksmiley.jpg
xmenmax
fajny skrypt party.gif może mi ktoś jeszcze powiedzieć jak zrobić tak jak na stronach że pisze że jesteś zalogowany i jest więcej funkcji questionmark.gif
ADeM
Poszytaj o sesjach.
xmenmax
jakich sesjach ? blinksmiley.gif
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.