Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Rejestracja użytkowników.
Forum PHP.pl > Forum > PHP
Macios25
Witajcie.
Proszę o rzucenie okiem na ten skrypt rejestracji, czy jest on poprawnie napisany i czy jest on przede wszystkim bezpieczny.

Tak jak już wcześniej pisałem, próbuje nauczyć się prawidłowego pisania skryptów w php dlatego będę wdzięczny za wskazanie błędów.

1. rejestracja.php ( formularz rejestracji. Tylko HTML. )

  1. <form action="zarejestruj.php" method="post">
  2.  
  3. <table border="0">
  4. <tr>
  5. <td>Login:</td>
  6. <input type="text" name="login" id="login" />
  7. </label></td>
  8. </tr>
  9. <tr>
  10. <td>Hasło:</td>
  11. <input type="password" name="haslo" id="haslo" />
  12. </label></td>
  13. </tr>
  14. <tr>
  15. <td>Powtórz hasło: </td>
  16. <input type="password" name="haslo2" id="haslo2" />
  17. </label></td>
  18. </tr>
  19. <tr>
  20. <td>Adres e-mail</td>
  21. <input type="text" name="email" id="email" />
  22. </label></td>
  23. </tr>
  24. <tr>
  25. <td>Login wspak*</td>
  26. <input type="text" name="loginwspak" id="loginwspak" />
  27. </label></td>
  28. </tr>
  29. <tr>
  30. <td></td>
  31. <td><input type="submit" value="zarejestruj"/></td>
  32. </tr>
  33. </form>
  34.  
  35. * Login wspak - w tym polu należy wpisać swój logi od tyłu np: login0123, 3210nigol. <br>
  36. Zabezpiecznenie to ma na celuoc ochronę przed botami.



2. funkcje_podstawowe.php - wszystkie funkcje, które będą używane przy rejestracji.

  1. <?php
  2.  
  3. function Polacz() {
  4.  
  5. $nowe_polaczenie = mysql_connect("localhost", "root", "");
  6. if (!$nowe_polaczenie) {
  7. die("Połączenie z bazą danych nie jest możliwe.");
  8. }
  9. $wybierz_baze_danych = mysql_select_db('bazadanych', $nowe_polaczenie);
  10. if (!$wybierz_baze_danych) {
  11. die("Nie udało sie wybrać bazy danych.");
  12. }
  13. }
  14.  
  15. /* Funkcja Połącz() służy do nawiązywania połączenia z bazą danych oraz wybierania bazy danych
  16. * oraz wybiera bazę danych, z którą chcemy pracować.
  17. * mysql_connect przyjmuje następujące argumenty ("ades serwera", "login", "hasło")
  18. * mysql_select_db jako argument przyjmuje nazwę bazy danych, z która ma zostać nawiązane
  19. * połączzeni.
  20. *
  21. * W przypadku gdy nawiązanie połączenia z bazą danych lub wybór bazy danych zakończy
  22. * się niepowodzeniem zostanie wyświetlony odpowiedni komunikat.
  23. */
  24.  
  25. function sprawdzanie_poprawnosci_hasla ($hasło, $hasło2){
  26. if ($hasło != $hasło2) {
  27. return("Pola hasło i powtórz hasło muszą być identyczne.");
  28. }
  29. elseif (strlen($hasło)<6) {
  30. return("Hasło musi zawierać przynajmniej 6 znaków.");
  31. }
  32. elseif (!preg_match('#^[0-9a-zA-ząźżćśóꥏŻĆÓĘ ]+$#ui', $hasło)) {
  33. return("Hasło zawiera niedozwolone znaki. Hasło może składać się tylko z liter i cyfr.");
  34. }
  35. elseif (!preg_match("/[0-9]/i", $hasło)) {
  36. return("Hasło musi zawierać przynajmniej jedno cyfrę.");
  37. }
  38. else {
  39. return("Poprawny");
  40. }
  41. }
  42. /* function sprawdzanie_poprawności_hasła przyjmuje dwa argumenty hasło, oraz powtórzone hasło.
  43. * 1.Sprawdza czy oba hasła są identyczne.
  44. * 2.Sprawdza czy hasło zawiera przynajmniej 6 znaków.
  45. * 3. Sprawdza czy hasło składa się tylko z polskich liter małych i dużych oraz cyfer.
  46. * 4. Sprawdza czy hasło zawiera chociaż jedną cyfrę.
  47. * Jeśli, któryś z tych warunków nie będzie spłeniony zostanie zwrócony stosowany komunikat.
  48. * Jeśli wszystkie warunki zostaną spełonionę funkcja zwróci komuniakt: "Poprawny".
  49. */
  50.  
  51. function sprawdzanie_poprawnosci_email($email) {
  52.  
  53.  
  54. if(!preg_match('/^[a-zA-Z0-9\.\-\_]+\@[a-zA-Z0-9\.\-\_]+\.[a-z]{2,4}$/D', $email )){
  55. return("Wprowadzony przez Ciebie adres e-mail jest nieprawidłowy.");
  56. }
  57.  
  58. $zapytanie = mysql_query(" SELECT 'login' FROM `users` WHERE mail= '$email' ");
  59. $liczba_wierszy = mysql_num_rows($zapytanie);
  60.  
  61.  
  62. if ($liczba_wierszy !=0 ) {
  63. return("Ten adres e-mail znajduje się już w bazie danych.");
  64. }
  65. else {
  66. return("Poprawny");
  67. }
  68. }
  69.  
  70. /* 1.preg_match() sprawdza czy e-mail jest poprawny.
  71. /*2. Funkcja mysql_query wykonuje zapytanie do bazy danych. Pobiera z niej loginy przypisane do
  72. * 3. danego adresu e-mail.
  73. * 4. mysql_num_rows() liczy ile wierwszy zwróciło zapytanie do bazy danych.
  74. * 5. Następnie sprawdzane jest czy taki adres już nie istnieje w bazie danych.
  75. */
  76.  
  77. function sprawdzanie_poprawnosci_loginu($login) {
  78.  
  79. if (!preg_match('#^[0-9a-zA-ząźżćśóꥏŻĆÓĘ ]+$#ui', $login)) {
  80. return("Login niepoprawny. Login może składać się tylko z liter i cyfr!");
  81. }
  82. elseif (strlen($login)>17) {
  83. return("Login jest za długi. Login może zawierać maksymalnie 16 znaków. ");
  84. }
  85.  
  86. $zapytanie = mysql_query(" SELECT 'login' FROM `users` WHERE login= '$login' ");
  87. $liczba_wierszy = mysql_num_rows($zapytanie);
  88.  
  89. if ($liczba_wierszy !=0 ) {
  90. return("Ten login jest już zajęty przez innego użytkownika.");
  91. }
  92. else {
  93. return("Poprawny");
  94. }
  95.  
  96.  
  97. }
  98. /* Funkcja sprawdza czy login składa się z dozwolonych znaków. ( cyfry, małe i duże litery )
  99. * Funkcja sprawdza czy login nie jest za długi.
  100. * Funkcja sprawdza czy login jest wolny.
  101. * Jeśli login jest porpawny, krótszy i niezajęty funkcja zwraca "Poprawny".
  102. */
  103.  
  104. function antybot($login,$loginwspak) {
  105.  
  106. if (strrev($login) != $loginwspak) {
  107. return("Pole login wspak zostało wypełnione niepoprawnie. ");
  108. }
  109. else {
  110. return("Poprawny");
  111. }
  112. }
  113.  
  114.  
  115. ?>

3. zarejestruj.php ( tutaj odbierany jest wcześniej wysłany formularz z pliku rejestracja.php )

  1. <?php
  2. if ( $_POST['login'] && $_POST['haslo'] != "" && $_POST['haslo2'] != "" && $_POST['email'] != "" && $_POST['loginwspak'] != "" ) {
  3.  
  4. /*Instrukcja if sprawdza czy zostaly wypelnione wszystkie pola. Jesli zostaly wkona sie caly
  5. * skrypt rejestracji. W przeciwnym przypadku zostanie wyswietlony komunikat "wszystkie pola musza *byc uzupelnione.
  6. */
  7. require('funkcje_podstawowe.php');
  8. Polacz();
  9. $login = mysql_real_escape_string ($_POST['login']);
  10. $haslo = mysql_real_escape_string ($_POST['haslo']);
  11. $haslo2 = mysql_real_escape_string ($_POST['haslo2']);
  12. $email = mysql_real_escape_string ($_POST['email']);
  13. $loginwspak= mysql_real_escape_string ($_POST['loginwspak']);
  14.  
  15. $licznik_bledow = 0;
  16. /* require() wczytuje plik podstawowe_funkcje.php.
  17. * zmiannym login, haslo, haslo2,email, loginwspak zostaja przypisane dane pobrane
  18. * z tablicy POST i przefiltrowane za pomoca funkcji mysql_real_escape_string.
  19. * Zostaje utworzona nowa zmiena licznik_bledów o wartosci 0.
  20. * licznik_bledów bedzie zliczal ile pól zostalo wypelnionych przez uzytkownika niepoprawnie.
  21. */
  22.  
  23. if ( sprawdzanie_poprawnosci_loginu($login) != "Poprawny" ) {
  24. echo("<br>".sprawdzanie_poprawnosci_loginu($login)."<br>" );
  25. $licznik_bledow ++;
  26. }
  27. //Instrukcja sprawdza czy login jest poprawny.
  28.  
  29. if ( sprawdzanie_poprawnosci_hasla($haslo,$haslo2) != "Poprawny" ) {
  30. echo(sprawdzanie_poprawnosci_hasla($haslo,$haslo2)."<br>" );
  31. $licznik_bledow ++;
  32. }
  33. //Instrukcja sprawdza czy jest hasla sa poprawne..
  34.  
  35. if ( sprawdzanie_poprawnosci_email($email) != "Poprawny" ) {
  36. echo( sprawdzanie_poprawnosci_email($email)."<br>");
  37. $licznik_bledow ++;
  38. }
  39. //Instrukcja sprawdza czy e-mail jest poprawny.
  40.  
  41. if ( antybot($login,$loginwspak)!="Poprawny" ) {
  42. echo ( antybot($login,$loginwspak)."<br>");
  43. $licznik_bledow ++;
  44. }
  45.  
  46. if ($licznik_bledow == 0) {
  47. $wprowadz = "INSERT INTO `users` (`login`, `haslo`, `mail`) VALUES('$login', '$haslo', '$email')";
  48. $zarejestruj = mysql_query($wprowadz);
  49. echo("Urzytkownik: ".$login." został zarejestrowany!");
  50. }
  51.  
  52.  
  53. /* Jeśli licznik_bledow jest równy 0, czyli wszystkie pola zostały wypełnione poprawnie -
  54. * dokona się rejestracja. W tabeli useres zostaną umieszczone dane nowego urzytkownika.
  55. */
  56.  
  57. }
  58. else {
  59. echo("<br>Rejestracja zakonczona niepowodzeniem<br>Musisz wypelnic wszystkie pola.<br>");
  60. }
  61.  
  62.  
  63. ?>
  64.  
  65.  
  66.  
  67.  


Z góry dziękuje za pomoc i opinie.

pozdrawiam
Macios25
adbacz
Ok, ale mam kilka zastrzeżeń. Dlaczego nie sprawdzasz na samym początku wykonywania skryptu, czy kazde pole zostało wypełnione tylko uzywasz zmiennej do zliczania?

Jesteś początkujący? Lepszym nawykiem jest zaczęcie używania anglojęzycznych nazw zmiennych i funkcji jesli będziesz chciał dalej w to brnąć. Lepiej teraz bo z nawyków trudno czasem zrezygnować.

Po return oraz echo nie trzeba wpisywać nawiasów, żeby instrukcja zadziałała. Oczywiście można, ale one służą raczej do matematycznych rzeczy i do uwzględniania pierwszeństwa w instrukcjach warunkowych przede wszystkim.

Jeśli wysyłasz ciąg znaków, jakiś napis, bez znaków specjalnych to lepiej używać pojedyńczych cudzysłowiów 'text' zamiast podwójnych "text".

A tak nawiasem, to jesli będziesz łądnie uzywał tabulatora to nie tylko Ty nie będziesz miał trudności z odczytywaniem kodu, ale i inni czytający twój kod.

W zewnetrznych funkcjach, gdy zwracasz wartość, i jest to jedna z dwóch możliwych (operacja sie wykonała lub nie) to lepiej używać takiego czegoś:
  1. if(1=1) {
  2. return TRUE;
  3. }
  4. else {
  5. return FALSE;
  6. }

Później podczas modyfikacji kodu, nie będziesz musiał skakać po plikach i szukać tej jednej funkcji która zwraca Ci ciąg, który wypisujesz na ekranie.
Macios25
Cytat
Dlaczego nie sprawdzasz na samym początku wykonywania skryptu, czy kazde pole zostało wypełnione tylko uzywasz zmiennej do zliczania?

Nie rozumiem za bardzo o co Tobie chodzi.

Na początku jest instrukcja, która sprawdza czy, któreś z pół nie jest puste.

  1. if ( $_POST['login'] && $_POST['haslo'] != "" && $_POST['haslo2'] != "" && $_POST['email'] != "" && $_POST['loginwspak'] != "" ) {
  2. ***
  3. Kod rejestracji.
  4. ****
  5. }
  6. else {
  7. echo ("Wszystkie pola muszą być wypełnione. ");
  8. }


Wprawdzie nie podoba mi się fakt, że prawie cały kod służący do rejestracji znajduje się w środku instrukcji if ale nie mogłem jakoś znaleźć lepszego rozwiązania.

Cytat
Jeśli wysyłasz ciąg znaków, jakiś napis, bez znaków specjalnych to lepiej używać pojedyńczych cudzysłowiów 'text' zamiast podwójnych "text".

Wielkie dzięki, zapoznałem się już jaka jest różnica.
( Nie wiedziałem, że "" to nie to samo co '').

Cytat
W zewnetrznych funkcjach, gdy zwracasz wartość, i jest to jedna z dwóch możliwych (operacja sie wykonała lub nie) to lepiej używać takiego czegoś.

Dobrze również zastosuje się do tej rady.


Cytat
Jesteś początkujący?

Tak, dlatego właśnie staram się pisać skrypty i publikować je na forum aby doświadczeni użytkownicy zwrócili mi uwagę na błędy. Potrzebuje mentora. smile.gif

Cytat
Lepszym nawykiem jest zaczęcie używania anglojęzycznych nazw zmiennych i funkcji jesli będziesz chciał dalej w to brnąć. Lepiej teraz bo z nawyków trudno czasem zrezygnować.

Z tym mogę mieć problem bo bardzo słabo znam język angielski.

Jeszcze raz dziękuje za rady.

Interesuje mnie jeszcze jedna rzecz, czy nie przesadzam z używaniem funkcji?
Używam ich tak nagminnie bo zależy mi aby skrypt był potem łatwy w edycji.



CuteOne
Funkcje są dobre jeżeli nie chcesz powielać tego samego kodu X razy, gdy chcesz odizolować pewne działania od reszty kodu lub Twój kod jest dość zagmatwany i chciałbyś aby był w miarę możliwości przejrzysty. W PHP są też pewne działania, które wykonasz tylko za pomocą funkcji / metod ale dowiesz się o tym jak "podrośniesz" smile.gif

ps. ilość użytych funkcji nie ma praktycznie żadnego znaczenia dla czasu wykonywania skryptu smile.gif
ps2. hashuj hasło i nie sprawdzaj czy nie ma znaków specjalnych smile.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.