Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Skrypt logowania a bezpieczeństwo
Axadiw
post
Post #1





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 13.03.2005

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


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:>

Ten post edytował Axadiw 6.07.2006, 10:56:54


--------------------
Galerio - galeria internetowa
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #2





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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.

Ten post edytował Cysiaczek 6.07.2006, 09:39:13


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
Axadiw
post
Post #3





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 13.03.2005

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


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? ;>


--------------------
Galerio - galeria internetowa
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #4





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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

Ten post edytował Cysiaczek 6.07.2006, 09:50:59


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
Axadiw
post
Post #5





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 13.03.2005

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


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


--------------------
Galerio - galeria internetowa
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #6





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




A. Jasne. Masz pełną kontrolę nad cookies, bo są na twoim komputerze. nie polecam uzywania cookie do przenoszenia praw dostępu.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
nasty
post
Post #7





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


1)
Czytaj dane z cookie :
  1. <?php
  2. echo $_COOKIE['nazwa_ciasteczka'];
  3. ?>


2) mozna zmienic vartosc cookie, sa takie programy do tego
Go to the top of the page
+Quote Post
Axadiw
post
Post #8





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 13.03.2005

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


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?


--------------------
Galerio - galeria internetowa
Go to the top of the page
+Quote Post
nasty
post
Post #9





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


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





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




heh. Ciekawe jak php.pl odczytuje cookie... Własnie zmieniłem cookie i dalej jestem zalogowany O.o


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
Axadiw
post
Post #11





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 13.03.2005

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


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


--------------------
Galerio - galeria internetowa
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #12





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Bo się nie odkodowuje, tylko porównuje smile.gif


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
Axadiw
post
Post #13





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 13.03.2005

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


no rozumiem, ale gdzie mam trzymac niezakodowane dane snitch.gif


--------------------
Galerio - galeria internetowa
Go to the top of the page
+Quote Post
cichy19-
post
Post #14





Grupa: Zarejestrowani
Postów: 100
Pomógł: 0
Dołączył: 5.06.2006

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


"Zapamiętaj mnie" możesz zrobić przy pomocy ciastek.

Mam chyba gdzieś nawet kod do tego
Go to the top of the page
+Quote Post
Axadiw
post
Post #15





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 13.03.2005

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


no, to jak mozesz... smile.gif

i ponawiam prosbe o te szyfrowanie ciastek


--------------------
Galerio - galeria internetowa
Go to the top of the page
+Quote Post
NetJaro
post
Post #16





Grupa: Zarejestrowani
Postów: 475
Pomógł: 0
Dołączył: 1.04.2005
Skąd: Warszawa

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


Zamiast sprawdzania każdego elementu tablicy $_POST możesz użyć foreach - będzie szybciej.
Go to the top of the page
+Quote Post
borec
post
Post #17





Grupa: Zarejestrowani
Postów: 260
Pomógł: 0
Dołączył: 18.07.2003
Skąd: Tarnów

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


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.


--------------------
Gentoo Linux 64bit / PHP 5.2 / MySQL 5.1
-> Administracja serwerami Linux i FreeBSD
Go to the top of the page
+Quote Post
Axadiw
post
Post #18





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 13.03.2005

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


  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?


--------------------
Galerio - galeria internetowa
Go to the top of the page
+Quote Post
borec
post
Post #19





Grupa: Zarejestrowani
Postów: 260
Pomógł: 0
Dołączył: 18.07.2003
Skąd: Tarnów

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


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

Ten post edytował borec 6.07.2006, 15:26:54


--------------------
Gentoo Linux 64bit / PHP 5.2 / MySQL 5.1
-> Administracja serwerami Linux i FreeBSD
Go to the top of the page
+Quote Post
Axadiw
post
Post #20





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 13.03.2005

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


ok, przepuszczam zmienne przez mysql_real_escape_string() to wystarczy, czy addslashes czy cos innego musze jeszcze


--------------------
Galerio - galeria internetowa
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 08:36