Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skrypt logowania a bezpieczeństwo
Forum PHP.pl > Forum > PHP
Axadiw
Witam,

Wzialem sie ostatnio za skrypt logowania na moją stronke, jednak nie wiem czy jest on dostatecznie bezpieczny(nie znam sie na exploitach itp, wiec nie wiem jak go zlamac:P).
Kolejnym problemem jest dodanie pola "Zapamiętaj mnie", zeby informacje ze ktos jest zalogowany byly przechowywane nawet po restarcie kompa itd.
Nie znam sie na sesjach, wiedze bralem z paru tutoraiali, i wyszlo cos takiego.

BTW. Jak zrobic tak fajnie, ze identyfikator sesji jest przekazywany wraz z adrsem strony(metoda GET), czy cookies są wystarczająco bezpieczne?

Skrypt przechowuje informacje w MySql, tablica wyglada tak(export z phpmyadmin)

  1. CREATE TABLE `users` (
  2. `nr` int(20) NOT NULL AUTO_INCREMENT,
  3. `login` varchar(20) NOT NULL DEFAULT '',
  4. `plec` varchar(20) NOT NULL DEFAULT '',
  5. `haslo` varchar(200) NOT NULL DEFAULT '',
  6. `data` date NOT NULL DEFAULT '0000-00-00',
  7. `email` varchar(50) NOT NULL DEFAULT '',
  8. `imie` varchar(50) NOT NULL DEFAULT '',
  9. `nazwisko` varchar(50) NOT NULL DEFAULT '',
  10. `ip` varchar(15) NOT NULL DEFAULT '',
  11. `user_level` smallint(6) NOT NULL DEFAULT '0',
  12. PRIMARY KEY (`nr`)
  13. ) TYPE=MyISAM AUTO_INCREMENT=50 ;


Skrypt rejestracji (index.php?mode=register)
  1. <?php
  2. function verifyEmail($email) {
  3.  $email = strtolower($email);
  4. return ereg("^[a-z0-9_.-]+@([a-z0-9_-]+.)+[a-z]{2,}$", $email);
  5. }
  6.  
  7. if (isset($_POST['plec']) AND isset($_POST['uname']) AND isset($_POST['passwd'])AND isset($_POST['passwd1']) AND isset($_POST['email'])AND isset($_POST['imie'])AND isset($_POST['nazwisko'])AND isset($_POST['ip']) )
  8. {
  9. $uname = $_POST['uname'];
  10. $email = $_POST['email'];
  11. $imie = $_POST['imie'];
  12. $nazwisko = $_POST['nazwisko'];
  13. $ip = $_POST['ip'];
  14. $passwd = $_POST['passwd'];
  15. $passwd1 = $_POST['passwd1'];
  16. $plec = $_POST['plec'];
  17.  if ($uname && $passwd && $passwd1 && $email && $imie && $nazwisko && $ip)
  18. {
  19. $data = date("Y-m-d");
  20. $uname = stripslashes($uname);
  21. $uname = ereg_replace(" ", "", $uname);
  22. $email = stripslashes($email);
  23. $imie = stripslashes($imie);
  24. $nazwisko = stripslashes($nazwisko);
  25. $ip = stripslashes($ip);
  26. $passwd = stripslashes($passwd);
  27. $passwd1 = stripslashes($passwd1);
  28. $email = ereg_replace(" ", "", $email);
  29. $imie = ereg_replace(" ", "", $imie);
  30. $nazwisko = ereg_replace(" ", "", $nazwisko);
  31. $ip = ereg_replace(" ", "", $ip);
  32. $passwd = ereg_replace(" ", "", $passwd);
  33. $passwd1 = ereg_replace(" ", "", $passwd1);
  34. $aa = mysql_query("SELECT * FROM users where login='$uname'");
  35. $znal = mysql_num_rows($aa);
  36. if ($znal==0){
  37. if ($passwd == $passwd1)
  38. {
  39. if (verifyEmail($email)==true){
  40. $passwd = md5($passwd);
  41. $res = mysql_query("INSERT INTO `users` (`login`,`haslo`,`email`, `imie`,`nazwisko`, `data`, `ip`, `plec`) VALUES ('$uname', '$passwd', '$email', '$imie', '$nazwisko', '$data', '$ip', '$plec')");
  42.  echo "<DIV id=opisy align=center>Dziękujemy za zarejestrowanie";
  43. echo "<P><A HREF=index.php>Kliknij tutaj</A> aby powrócić do strony głównej.</p></div>";
  44. }
  45. else {
  46.  echo "<DIV id=opisy align=center>Błędny e-mail.";
  47. echo "<P><A HREF=$PHP_SELF?mode=register>Kliknij tutaj</A> aby powrócić.</p></div>";}
  48. }
  49. }
  50. else
  51. {
  52. echo "<DIV id=opisy align=center>Taki uzytkownik już istnieje.";
  53. echo "<P><A HREF=$PHP_SELF?mode=register>Kliknij tutaj</A> aby powrócić.</p></div>";
  54. }
  55.  
  56. }
  57. else
  58. {
  59. echo "<DIV id=opisy align=center>Twoje hasła się nie pokrywają";
  60. echo "<P><A HREF=$PHP_SELF?mode=register>Kliknij tutaj</A> aby powrócić.</p></div>";
  61. }
  62. }
  63. else {
  64. echo <<<END
  65. <div id="belka">Rejestracja</div>
  66. <br>
  67. <FORM ACTION="" METHOD=post>
  68.  
  69. <table border="0" width="100%" cellspacing="0" cellpadding="0">
  70.   <tr>
  71. <td width="42%" align="right"><span id="opisy">Login:</span></td>
  72. <td width="58%"><span id="formularz"> <input type="text" name="uname" size="20"></span></td>
  73.   </tr>
  74.   <tr>
  75. <td width="42%" align="right"><span id="opisy">Hasło:</span></td>
  76. <td width="58%"><span id="formularz"><input type="password" name="passwd" size="20"></span></td>
  77.   </tr>
  78.   <tr>
  79. <td width="42%" align="right"><span id="opisy">Ponownie Hasło:</span></td>
  80. <td width="58%"><span id="formularz"> <input type="password" name="passwd1" size="20"></span></td>
  81.   </tr>
  82.   <tr>
  83. <td width="42%" align="right"><span id="opisy">Imię:</span></td>
  84. <td width="58%"><span id="formularz"> <input type="text" name="imie" size="20"></span></td>
  85.   </tr>
  86.   <tr>
  87. <td width="42%" align="right"><span id="opisy">Nazwisko:</span></td>
  88. <td width="58%"><span id="formularz"> <input type="text" name="nazwisko" size="20"></span></td>
  89.   </tr>
  90.   <tr>
  91.    <td width="42%" align="right"><span id="opisy">Płeć:</span></td>
  92. <td width="58%"><span id="formularz">
  93.  
  94. M
  95. <input name="plec" value="M" type="radio">
  96. K
  97. <input name="plec" value="K" type="radio">
  98.    </td>
  99.   </tr>
  100.   <tr>
  101.  
  102. <td width="42%" align="right"><span id="opisy">E-Mail:</span></td>
  103. <td width="58%"> <span id="formularz"><input type="text" name="email" size="20"></span></span></td>
  104. <input type="hidden" name="ip" size="20" value="$REMOTE_ADDR">
  105. </td></tr></table><center>
  106. <INPUT TYPE=image SRC=grafika/wyslij.gif BORDER=0 name=submit>
  107. </form><BR><span id="opis_glowny" stle="font-size:15pt">Należy wypełnić wszystkie pola !</span>
  108. END;
  109.  
  110.  }
  111.  
  112. ?>



Forma logowania z skryptem(index.php?mode=login)
  1. <?php
  2. if (isset($_POST['uname']) AND isset($_POST['passwd']))
  3. {
  4. $login = $_POST['uname'];
  5. $haslo = $_POST['passwd'];
  6. $odp = mysql_query("SELECT * FROM users where login='$login'");
  7. $razem = mysql_num_rows($odp);
  8. $wynik = mysql_fetch_array($odp);
  9. if ($razem!=0)
  10. {
  11. if (md5($haslo)==$wynik['haslo'])
  12. {
  13. $email = $wynik['email'];
  14. $plec = $wynik['plec'];
  15. $imie = $wynik['imie'];
  16. $nazwisko = $wynik['nazwisko'];
  17. $user_level = $wynik['user_level'];
  18. session_register("login");
  19. session_register("email");
  20. session_register("nazwisko");
  21. session_register("user_level");
  22. echo "<DIV id=opisy align=center>Haslo poprawne";
  23. echo "<P><A HREF=index.php>Kliknij tutaj</A> aby powrócić do strony głównej.</p></div>";
  24. }
  25. else
  26. echo 'Błędne haslo';
  27. }
  28. else
  29. echo 'Nie ma takiego uzytkownika';
  30. }
  31. else
  32. {
  33. echo <<<END
  34. <div id="belka">Logowanie</div>
  35. <br>
  36. <FORM ACTION="" METHOD=post>
  37.  
  38. <table border="0" width="100%" cellspacing="0" cellpadding="0">
  39.   <tr>
  40. <td width="42%" align="right"><span id="opisy">Login:</span></td>
  41. <td width="58%"><span id="formularz"> <input type="text" name="uname" size="20"></span></td>
  42.   </tr>
  43.   <tr>
  44. <td width="42%" align="right"><span id="opisy">Hasło:</span></td>
  45. <td width="58%"><span id="formularz"><input type="password" name="passwd" size="20"></span></td>
  46.   </tr>
  47. <input type="hidden" name="ip" size="20" value="$REMOTE_ADDR">
  48. </td></tr></table><center>
  49. <INPUT TYPE=image SRC=grafika/wyslij.gif BORDER=0 name=submit>
  50. </form>
  51. END;
  52. }
  53. ?>


a wylogowanie to(index.php?mode=logout)
  1. <?php
  2.  
  3. echo '<DIV id=opisy align=center>Wylogowano ' . $login . '</div>';
  4. ?>



To wszystko, przepraszam ze moze troche zamotałem, ale mam nadzieje ze zrozumieliscie:>
Cysiaczek
Uzywasz md5(), a varchar w polu haslo w bazie danych ma 200 znaków długości - Ja bym zmienił na 32, bo taka długość ma hash md().

jeśli chcesz zapamietać informacje o logowaniu po restarcie kompa, to nie b ędzie to za bardzo bezpieczne. Jesli jednak koniecznie chcesz, to stwórz sobie własną obsługę sesji - np. zapisuj informacje o zalogowaniu w bazie danych/pliku. Nie polecam jednak tej metody :|. Lepiej logować się od nowa.
Axadiw
ok, zmienilem dlugosc pola na 32

chyba faktycznie odpuszcze sobie zapamietywanie logowania,

a co do reszty skryptu, da rade go jakos zlamać? czy jest odporny na wsio? ;>
Cysiaczek
Nie wygląda źle... http://www.php.net/manual/pl/security.php <-- tu jest wiecej

aha. session_register() niedługo zniknie. Używaj $_SESSION[nazwa]=wartosc
Axadiw
ok, to jeszcze jedno pytanie:
dane sa zapisywane w cookies, a jaki sposob je podejrzeć, czy gdybym sie uparł, bedac zwyklym userem moge zmienić cookie?(gdy zmienie $user_level to moge sie podawac za np admina...)
Cysiaczek
A. Jasne. Masz pełną kontrolę nad cookies, bo są na twoim komputerze. nie polecam uzywania cookie do przenoszenia praw dostępu.
nasty
1)
Czytaj dane z cookie :
  1. <?php
  2. echo $_COOKIE['nazwa_ciasteczka'];
  3. ?>


2) mozna zmienic vartosc cookie, sa takie programy do tego
Axadiw
cos polecasz? przechowywanie danych w mysql a w cookies tylko identyfikator sesji?
jesli tak, to zamiast cookies uzywalbym metody GET(chce sie zabiezpieczyc, gdyby ktos mial w przegladarce wylaczona obsluge ciasteczek)
da rade jakos to sprytnie zrobic, zbytnio nie ingerując w kod?
nasty
nie, w cookies mozesz trzymac dane ale odpowiednio je zabezpiecz, np.
passwordy w md5, szyfrowanie, itd...
jak sobie to dobrze ubezpieczysz to wtedy cookies sa bardzo bezpieczne...
Cysiaczek
heh. Ciekawe jak php.pl odczytuje cookie... Własnie zmieniłem cookie i dalej jestem zalogowany O.o
Axadiw
passworda nie musze trzymac podczas przegladania strony(potrzebny tylko podczas logowania, i ew. zmiany hasla)

wiec w cookies trzymam login, status usera(zwykly user,admin, modek itp) i ew. reszta pól wpisywanych podczas rejestracji. jak zakoduje wszystko do md5, to potem nie odkoduje przeciez
Cysiaczek
Bo się nie odkodowuje, tylko porównuje smile.gif
Axadiw
no rozumiem, ale gdzie mam trzymac niezakodowane dane snitch.gif
cichy19-
"Zapamiętaj mnie" możesz zrobić przy pomocy ciastek.

Mam chyba gdzieś nawet kod do tego
Axadiw
no, to jak mozesz... smile.gif

i ponawiam prosbe o te szyfrowanie ciastek
NetJaro
Zamiast sprawdzania każdego elementu tablicy $_POST możesz użyć foreach - będzie szybciej.
borec
Cytat
  1. <?php
  2. $login = $_POST['uname'];
  3. $haslo = $_POST['passwd'];
  4. $odp = mysql_query("SELECT * FROM users where login='$login'");
  5. ?>

1. Co po tworzysz duplikaty tych samych wartości zmiennych?
2. Nie filtrujesz danych przychodzących z POSTa i ładujesz je wprost do mysql_query() - niezbyt mądre, pogoogluj za SQL Incejtion.
Axadiw
  1. <?php
  2. $uname = stripslashes($uname);
  3. $uname = ereg_replace(" ", "", $uname);
  4.  $aa = mysql_query("SELECT * FROM users where login='$uname'");
  5. ?>

przeciez jest napisane, lekka obrobka tych zmeinnych jest;]
jescze htmlspecialchars() dodam i powinno byc dobrze, nie?
borec
Cytat(Axadiw @ 6.07.2006, 16:13 ) *
  1. <?php
  2. $uname = stripslashes($uname);
  3. $uname = ereg_replace(" ", "", $uname);
  4.  $aa = mysql_query("SELECT * FROM users where login='$uname'");
  5. ?>

przeciez jest napisane, lekka obrobka tych zmeinnych jest;]
jescze htmlspecialchars() dodam i powinno byc dobrze, nie?

Nie. stripslashes() może Ci tylko zaszkodzić. Załóżmy, że ktoś wpisze taki login:
Kod
' OR 1 ---

Wtedy wybierze pierwszy lepszy login z bazy. Na forum jest przyklejony topic o SQL Injection, na prawdę warto poczytać.
Axadiw
ok, przepuszczam zmienne przez mysql_real_escape_string() to wystarczy, czy addslashes czy cos innego musze jeszcze
piwoszeq
zapamietaj mnie jest bardzo latwo napisac smile.gif

zapisujesz login oraz haszowane haslo w ciastkach i jesli ciacho takowe istanieje to przeprowadza logowanie bez udzialu usera winksmiley.jpg simple ?tongue.gif

co do tego co w tych ciachach przechowujesz to napisales ze jest tam kto jest adminem or cos takiego smile.gif
to jest imo niebezpieczne i kazdy noob moze sobie dac admina na twojej stronie ;P wiec zrob to inaczej smile.gif

tyle odemnie poszukaj na forum temat byl ho ho ho razy powtarzany.
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.