Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Optymalizacja rejestracji i pytanie
Forum PHP.pl > Forum > PHP
Bellum
Witam, chciałbym prosić o optymalizacje (a konkretnie rady co należałoby zmienić) kodu doświadczonych programistów

rejestracja.php

  1. <?php if(isset($_SESSION['session_user']))
  2. {
  3. header('location: index.php');
  4. }
  5. else
  6. {
  7. echo "<div class='h3'><h3>Rejestracja</h3></div><div class='text'>";
  8. echo "<form action='' method='POST'>
  9. <table>
  10. <tr>
  11. <td>Nazwa użytkownika:</td><td><input type='text' name='user' /></td>
  12. </tr>
  13. <tr>
  14. <td>Adres email:</td><td><input type='text' name='email' /></td>
  15. </tr>
  16. <tr>
  17. <td>Hasło:</td><td><input type='password' name='password' /></td>
  18. </tr>
  19. <tr>
  20. <td>Powtórz hasło:</td><td><input type='password' name='repassword' /></td>
  21. </tr>
  22. <tr>
  23. <td colspan=2><input type='submit' name='zarejestruj' value='Wyślij' /></td>
  24. </tr>
  25. </table>
  26. </form>";
  27. echo "</div>";
  28.  
  29. require_once'config_db.php';
  30. if(isset($_POST['zarejestruj']))
  31. {
  32. $date = time();
  33. $user = $_POST['user'];
  34. $email = $_POST['email'];
  35. $ip = $_SERVER['REMOTE_ADDR'];
  36. $password = $_POST['password'];
  37. $repassword = $_POST['repassword'];
  38.  
  39. #Sprawdzanie pól formularza
  40. if(!$_POST['user'] || !$_POST['password'] || !$_POST['repassword'] || !$_POST['email'])
  41. {
  42. echo "Jedno bądź więcej pól w formularzu jest puste...";
  43. exit;
  44. }
  45.  
  46. #Sprawdzanie wprowadzonych danych
  47. if(!eregi('^[a-zA-z]+', $user))
  48. {
  49. echo "Nazwa użytkownika może zawierać wyłącznie małe i duże litery...";
  50. exit;
  51. }
  52. elseif(!eregi('^[a-zA-z0-9]+', $password))
  53. {
  54. echo "Hasło może zawierać wyłącznie małe i duże litery oraz cyfry...";
  55. }
  56. elseif(!eregi('^[a-zA-z0-9]+', $repassword))
  57. {
  58. echo "Hasło może zawierać wyłącznie małe i duże litery oraz cyfry...";
  59. exit;
  60. }
  61. elseif(!eregi('^[a-zA-z0-9]+@[a-zA-z0-9\-]+\.[a-zA-z0-9\-\.]+$', $email))
  62. {
  63. echo "Adres email, jest niepoprawny...";
  64. exit;
  65. }
  66.  
  67. #Sprawdzanie czy hasła są identyczne
  68. if($_POST['password'] != $_POST['repassword'])
  69. {
  70. echo "Hasła nie są takie same...";
  71. }
  72.  
  73. #Sprawdzanie czy taki użytkownik już istnieje
  74. $mysqlia = "SELECT user FROM user";
  75. $mysqlib = $db->query($mysqlia);
  76. while($echo = $mysqlib->fetch_object())
  77. if(($echo->user) == $user)
  78. {
  79. echo "Użytkownik o takiej nazwie już istnieje...";
  80. }
  81.  
  82. #Sprawdzanie czy taki email już istnieje
  83. $mysqlia = "SELECT email FROM user";
  84. $mysqlib = $db->query($mysqlia);
  85. while($echo = $mysqlib->fetch_object())
  86. if(($echo->email) == $email)
  87. {
  88. echo "Ktoś się zarejestrował już z tego adresu email...";
  89. }
  90.  
  91. #################
  92. ## REJESTRACJA ##
  93. #################
  94. $mysqli = "INSERT INTO user (user, password, email, date, ip) VALUES ('$user' , '".md5($password)."', '$email', '$date', '$ip')";
  95. $echo = $db->query($mysqli);
  96. if($echo)
  97. {
  98. echo "Zostałeś pomyślnie zarejestrowany, oczekuj na aktywacje...";
  99. }
  100. else
  101. {
  102. echo "Wystąpił błąd, jeżeli błąd się powtarza skontaktuj się z administratorem...";
  103. exit;
  104. }
  105. }
  106. }
  107. ?>


I największe moje pytanie, które już dawno chciałem zadać "Jak przypisać id użytkowników do sesji, obecnie loguję po nazwie użytkownika" tak:

  1. <?php
  2. if(isset($_SESSION['session_user']))
  3. {
  4. header('location: index.php');
  5. }
  6. else
  7. {
  8. echo "<div class='h3'><h3>Logowanie</h3></div><div class='text'>";
  9. echo "<form action='' method='POST'>
  10. <table>
  11. <tr>
  12. <td>Nazwa użytkownika:</td><td><input type='text' name='user' /></td>
  13. </tr>
  14. <tr>
  15. <td>Hasło:</td><td><input type='password' name='password' /></td>
  16. </tr>
  17. <tr>
  18. <td colspan=2><input type='submit' name='zaloguj' value='Zaloguj' /></td>
  19. </tr>
  20. </table>
  21. </form>";
  22. echo "</div>";
  23.  
  24. require_once'config_db.php';
  25. if(isset($_POST['zaloguj']))
  26. {
  27. $user = $_POST['user'];
  28. $password = $_POST['password'];
  29.  
  30. #Sprawdzanie pól formularza
  31. if(!$_POST['user'] || !$_POST['password'])
  32. {
  33. echo "Jedno bądź więcej pól w formularzu jest puste...";
  34. exit;
  35. }
  36.  
  37. #Sprawdzanie wprowadzonych danych
  38. if(!eregi('^[a-zA-z]+', $user))
  39. {
  40. echo "Nazwa użytkownika może zawierać wyłącznie małe i duże litery...";
  41. exit;
  42. }
  43. elseif(!eregi('^[a-zA-z0-9]+', $password))
  44. {
  45. echo "Hasło może zawierać wyłącznie małe i duże litery oraz cyfry...";
  46. }
  47. ###############
  48. ## LOGOWANIE ##
  49. ###############
  50. if(isset($_POST['user']) && isset($_POST['password']))
  51. {
  52. $mysqlia = "SELECT * FROM user WHERE user='".$user."' AND password='".md5($password)."'";
  53. $echo = $db->query($mysqlia);
  54. if($echo->num_rows > 0)
  55. {
  56. $_SESSION['session_user'] = $user;
  57. header('location: index.php');
  58. }
  59. else
  60. {
  61. echo "Login lub hasło, jest niepoprawne...";
  62. }
  63. $db->close();
  64. }
  65. }
  66. }
  67. ?>


To wszystko co potrafię w php mnie to wystarczy ale czy jest dobrze zoptymalizowane czy też można by coś dodać bądź zmienić to byłoby miło. Najbardziej jednak nurtuje mnie pytanie, które napisałem wyżej smile.gif

@kolejne z pytań: przy rejestracji jest tak, że dla kodu użytkownik Bellum i użytkownik bElLuM to inne osoby wystarczy inne hasło i email by się zarejestrować, ponad to przy logowaniu zamiast bElLuM mogę wpisać Bellum i hasło ale nie do Bellum tylko do bElLuM i się normalnie zaloguję, proszę o radę myślę, że chodzi tutaj o uwzględnianie wielkości liter.
kadlub
jeśli chodzi o bezpieczeństwo to
ja bym filtrował dane przesyłane z formularza np tak
http://php.net/manual/pl/function.mysql-re...cape-string.php
jak zapisać id użytkownika do sesji to jak sprawdzasz czy istnieje dany login i hasło tym zapytaniem
  1. $mysqlia = "SELECT * FROM user WHERE user='".$user."' AND password='".md5($password)."'";

to możesz pobrać id użytkownika i zapisać je do sesji
Bellum
Cytat(kadlub @ 23.04.2011, 15:48:34 ) *
jeśli chodzi o bezpieczeństwo to
ja bym filtrował dane przesyłane z formularza np tak
http://php.net/manual/pl/function.mysql-re...cape-string.php
jak zapisać id użytkownika do sesji to jak sprawdzasz czy istnieje dany login i hasło tym zapytaniem
  1. $mysqlia = "SELECT * FROM user WHERE user='".$user."' AND password='".md5($password)."'";

to możesz pobrać id użytkownika i zapisać je do sesji

kadkub ale ja tego nie rozumiem właśnie, zmienna $user trzyma login a zapytanie do bazy danej idzie po zmiennej, później tą zmienną przekazuję do sesji. Powtarzam dla mnie php, jest trudne nie mam głowy, bardzo długo pisze skrypty, nienawidzę kopiować. Co muszę tu zrobić by to $id (które jakoś muszę przypisać do) do $user i zmienną $id przekazać do sesji, bo inaczej to po czym miałoby to identyfikować kto się loguję, przecież nie losowo?
Valker
Tak więc:

Kod 1
1. Linie 57-61
Jak dla mnie nie potrzebne używanie dodatkowego wyrażenie regularnego. Jeśli sprawdzasz już hasło to potem to powtórzenie wystarczy sprawdzić czy jest takie samo jak to hasło. Jak hasło jest złe to co za różnica czy jego powtórzenie jest poprawne. A jak hasło jest poprawne to jeśli powtózenie jest takie samo to znaczy, że musi przejść to wyrażenie regularne.
2. Używanie eregi
Niby działa, ale zgodnie z Manualem nie powinno się go już stosować: http://pl.php.net/eregi
3. #Sprawdzanie czy taki użytkownik już istnieje
Nie za bardzo rozumiem czemu pobierasz listę wszystkich użytkowników, aby sprawdzić czy już taki istnieje. Przy małej ilości userów to nie ma zbytnio różnicy, ale przy dużej już jest to poważny błąd. Lepiej zastosować pytanie typu:
  1. SELECT count(user) AS cnt FROM user WHERE user = "<tutaj nick>"

4. #Sprawdzanie czy taki email już istnieje
To samo co powyżej ^^
5. Linia 98
Zamiast wywoływać funkcje time() wcześniej możesz to zrobić w zapytaniu poprzez np. NOW() zamiast '$date'
6. Hasło
Wprowadził bym jakieś minimalną długość hasła, bo teraz możesz mieć 1 znakowe ;>

Kod 2
1.
Tutaj bym nie sprawdzał czy hasło składa się tylko z liter i cyfr. Dlaczego? Bo i tak liczysz z tego sumę md5, więc nie ma za bardzo znaczenia czy to pole zawiera niebezpieczne znaki czy nie.

Co do pytania: jeśli masz w bazie danych pole id to wystarczy, że je pobierzesz (a pobierasz bo korzystasz z *) i jak użyjesz funkcji np. http://pl.php.net/mysql_fetch_row to będziesz mógł pobrać to pole i przypisać do zmiennej.


Ostatnie pytanie:
Linię 33 w pierwszym kodzie zamień na:
  1. $user = trim(strtolower($_POST['user']));


Pozdr,
Valker
Bellum
ok zrobię to po kolei ale dałeś mi kilka kodów, których jeszcze nie używałem i muszę się najpierw z nimi zapoznać w związku z czym mam pytanie. Dzięki za linię 33.
  1. SELECT count(user) AS cnt FROM user WHERE user = "<tutaj nick>"
łeee? worriedsmiley.gif Czy w nick mam wstawić zmienną $user?
Co do id by przypisać do sesji:
  1. $mysqlia = "SELECT * FROM user WHERE user='".$user."' AND password='".md5($password)."'";
  2. $mysqlib = $db->query($mysqlia);
  3. if($echo = $mysqlib->fetch_object())
  4. { $id = $echo->id;
  5. $_SESSION['session_user'] = $id;
  6. header('location: index.php');
  7. }
  8. else
  9. {
  10. echo "Login lub hasło, jest niepoprawne...";
  11. }

Robię to z fetch_object na różne sposoby i mam błąd: Już działa cacy smile.gif
  1. Fatal error: Call to a member function fetch_object() on a non-object in C:\Documents and Settings\PC\Moje dokumenty\httpd\httpd\smok\user\zaloguj.php on line 56

Mózg już mi się lasuję nie mam cierpliwości, przerwa, kodowanie, dłuższe przerwy, kodowanie... DZIAŁA, takie małe błędy a tyle frustracji.
Valker
Kod
SELECT count(user) AS cnt FROM user WHERE user = "<tutaj nick>"

Nie, nie.. Wstawiasz tam nick pobrany z post'a, czyli $user.

Co do drugiego pytanie nie wiem czym u ciebie jest zmienna $db i ciężko jest mi powiedzieć jak u ciebie pobierać rekordy z bazy danych ;D
Bellum
  1. $mysqlia = "SELECT count(user) AS cnt FROM user WHERE user = '".$user."'";
  2. $mysqlib = $db->query($mysqlia);
  3. while($echo = $mysqlib->fetch_object())
  4. if(($echo->user) == $user)
  5. {
  6. echo "Użytkownik o takiej nazwie już istnieje...";
  7. }

Czy to tak ma wyglądać? w ogóle nie znam tego rodzaju zapytania worriedsmiley.gif, teraz przepuszcza kolony jak wodę mmm...
Valker
Nie ;P
Spróbuj:
  1. $mysqlia = "SELECT count(*) AS cnt FROM user WHERE user = '".$user."'";
  2. $mysqlib = $db->query($mysqlia);
  3. $row = $mysqlib->fetch_assoc();
  4. if($row['cnt'] != 0)
  5. {
  6. echo "Użytkownik o takiej nazwie już istnieje...";
  7. }
Bellum
guitar.gif Tak działa, teraz zrobiłem logowanie i dwie sesje jedna trzyma id druga login, spróbuję zrobić logowanie wielopoziomowe, admin, mod itp. ewentualnie wpadnę tutaj, dzięki.

ps: email też poprawiłem.
------------------------------------------------------------------
Podbijam z nowym pytaniem.
Mam panel administracyjny, nazywa się ustawienia, po wejściu w niego wyświetla się spis użytkowników, jeżeli kliknę użytkownika, to jest tworzona jakbym wirtualna strona nie znam technicznego określenia posługuję się:

  1. $fid = intval( $_GET['fid'] );
Jeżeli zmienna $fid jest mniejsza od 1 to wyświetla się standardowa lista użytkowników.
Natomiast:
  1. elseif( is_numeric( $fid ) )
to wykonuję określoną akcję np: pokazuje dokładne dane użytkownika.
Problem polega na tym a konkretnie brak mojego zrozumienia odnośnie w jaki sposób to zrobić i czy w ogóle się za to zabierać, że w menu widnieje odnośnik dodaj news.

KOD USTAWIEŃ:
  1. <?php if(isset($_SESSION['session_user']))
  2. {
  3. require_once'config_db.php';
  4.  
  5. $fid = intval( $_GET['fid'] );
  6. if( ! isset( $fid ) || $fid < 1 )
  7.  
  8. {
  9. switch ($_GET['said'])
  10. {
  11. case "news":
  12. include'news.php';
  13. break;
  14. }
  15. echo "<form action='' method='POST'>";
  16. echo "<table class='list' width='100%' cellpadding='10' cellspacing='0'>";
  17. echo "<tr><td class='tdborderl'>Użytkownik</td><td class='tdborderc'>e-mail</td><td class='tdborderr'>Data rejestracji</td><td class='tdborderr'>Usuń</td></tr>";
  18. $mysqlia = "SELECT id, user, email, date FROM user ORDER BY ID DESC";
  19. $mysqlib = $db->query($mysqlia);
  20. while($echo = $mysqlib->fetch_object())
  21. {
  22. echo "<tr><td><a href='index.php?sid=ustawienia&fid=".$echo->id."' title='".$echo->user."'>".$echo->user."</a></td>";
  23. echo "<td>".$echo->email."/td>";
  24. echo "<td>".$human_date = date("Y-m-d H:i:s", $echo->date)."</td>";
  25. echo "<td><input class='input' type='checkbox' name='deleteus[]' value='".$echo->id."' /></td></tr>";
  26. }
  27. echo "<tr><td colspan='4'><input type='submit' value='Usuń' /></td></tr>";
  28. echo "</table>";
  29.  
  30. $delete_id=$_POST['deleteus'];
  31. $ilosc=count($delete_id);
  32.  
  33. for($i=0; $i<$ilosc; $i++) {
  34. $question = "DELETE FROM user WHERE id='".$delete_id[$i]."'";
  35. $anserwer = $db->query($question);
  36. }
  37. if($anserwer)
  38. {
  39. header('location: index.php?sid=ustawienia');
  40. }
  41. }
  42. elseif( is_numeric( $fid ) )
  43. {
  44. $mysqlia = "SELECT id, user, date, email FROM user WHERE id=(".intval($_GET['fid']).")";
  45. $mysqlib = $db->query($mysqlia);
  46. while($echo = $mysqlib->fetch_object())
  47. {
  48. echo "Użytkownik: ".$echo->user."<br />mail: ".$echo->email."<br />".$human_date = date("Y-m-d H:i:s", $echo->date)."<br /><hr></hr><a href='java script:history.back();'><< Wstecz</a>";
  49. }
  50. }
  51. else{echo "BŁĄD";}
  52. }
  53. else
  54. {
  55. header('location: index.php');
  56. }
  57. ?>


KOD NEWSA
  1. <?php echo "<form action='' method='POST'>";
  2. echo "<table class='list' width='100%' cellpadding='10' cellspacing='0'>";
  3. echo "<tr><td class='tdborderl'>Autor</td><td class='tdborderc'>Tytuł</td><td class='tdborderr'>Data dodania</td><td class='tdborderr'>Usuń</td></tr>";
  4. $mysqlia = "SELECT id, title, autor, date FROM code ORDER BY ID DESC";
  5. $mysqlib = $db->query($mysqlia);
  6. while($echo = $mysqlib->fetch_object())
  7. {
  8. echo "<tr><td><a href='index.php?sid=ustawienia&said=news&fid=".$echo->id."' title='".$echo->title."'>".$echo->autor."</a></td>";
  9. echo "<td>".$echo->title."</td>";
  10. echo "<td>".$human_date = date("Y-m-d H:i:s", $echo->date)."</td>";
  11. echo "<td><input class='input' type='checkbox' name='deleteus[]' value='".$echo->id."' /></td></tr>";
  12. }
  13. echo "<tr><td colspan='4'><input type='submit' value='Usuń' /></td></tr>";
  14. echo "</table><br />";
  15. ?>


Standardowo po wejściu w stawienia pojawia mi się lista użytkowników, po kliknięciu Dodaj news za pomocą switch wczytuje plik news.php i wszystko cacy, jednak, jeżeli chcę wejść w newsa i przypisać dodatkowe akcje nie tworząc plików dodatkowych, to nie mogę sobie go podczepić pod
  1. elseif( is_numeric( $fid ) )
bo ten parametr wykonuje tylko dla użytkowników akcje, szukam rozwiązania by fid rozpoznawał czy jestem w news czy ustawieniach.
Jeżeli jestem w news to parametr wyglądałby tak
  1. <a href='index.php?sid=ustawienia&said=news&fid=".$echo->id."' title='".$echo->title."'>".$echo->autor."</a>

A jeżeli jestem w ustawieniach standardowych i przeglądam dane użytkownika czyli wykonała się akcja jeżeli zmienna fid istnieje
  1. <a href='index.php?sid=ustawienia&fid=".$echo->id."' title='".$echo->user."'>".$echo->user."</a>

CZYLI już konkretniej jak mogę wytłumaczyć chcę by ten parametr:
  1. elseif( is_numeric( $fid ) )
  2. {
  3. $mysqlia = "SELECT id, user, date, email FROM user WHERE id=(".intval($_GET['fid']).")";
  4. $mysqlib = $db->query($mysqlia);
  5. while($echo = $mysqlib->fetch_object())
  6. {
  7. echo "Użytkownik: ".$echo->user."<br />mail: ".$echo->email."<br />".$human_date = date("Y-m-d H:i:s", $echo->date)."<br /><hr></hr><a href='java script:history.back();'><< Wstecz</a>";
  8.  
  9. TUTAJ druga AKCA DLA NEWSÓW A NIE USERÓW
  10. }
  11. }

rozróżniał akcje ale nadal w jednym pliku.

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