Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: obiektowy system autoryzacji
Forum PHP.pl > Inne > Oceny
tab
troche mi zajelo zeby ogarnac ten caly oop, wiec jak juz mi sie w koncu udalo to postanowilem sobie cos napisac. moglibyscie to ocenic pod katem bezpieczenstwa i wydajnosci? pozdrawiam

index.php
  1. <?php ob_start() ?>
  2.  
  3. <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  4. <a href="index.php">Logowanie</a> <a href="reg.php">Rejestracja</a>
  5.  
  6. <form action="index.php" method="post">
  7. Login: <input type="text" name="login"><br>
  8. Hasło: <input type="password" name="passwd"><br>
  9. <input type="submit" name="log" value="Zaloguj">
  10. </form>
  11.  
  12. <?php
  13. class User
  14. {
  15. private $_login;
  16. private $_passwd;
  17. private $_id;
  18.  
  19. public function __get ($name)
  20. {
  21. return $this->getValue($name);
  22. }
  23.  
  24. public function __construct ($login,$passwd)
  25. {
  26. $this->_login = $login;
  27. $this->_passwd = sha1($passwd);
  28. }
  29.  
  30. public function getValue ($name)
  31. {
  32. return $this->$name;
  33. }
  34.  
  35. public function auth ()
  36. {
  37. $pdo = new PDO('mysql:host=localhost;dbname=DBNAME', 'LOGIN', 'HASLO');
  38. $stmt=$pdo->query("SELECT id FROM users WHERE login='$this->_login' and passwd='$this->_passwd'");
  39. $res=$stmt->fetch(PDO::FETCH_ASSOC);
  40. $stmt->closeCursor();
  41.  
  42. $this->_id = $res['id'];
  43.  
  44. if (empty($res)) die('Niepoprawne dane');
  45. }
  46.  
  47. public function logme ()
  48. {
  49.  
  50. if (!isset($_SESSION['init']))
  51. {
  52. $_SESSION['init'] = true;
  53. }
  54.  
  55. $_SESSION['id'] = $this->_id;
  56. $_SESSION['login'] = $this->_login;
  57. header('Location: main.php');
  58. }
  59. }
  60.  
  61. if (isset($_POST['log']))
  62. {
  63. $user = new User(strip_tags(trim($_POST['login'])),($_POST['passwd']));
  64. $user->auth();
  65. $user->logme();
  66. }
  67. ?>

reg.php
  1. <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  2. <a href="index.php">Logowanie</a> <a href="reg.php">Rejestracja</a>
  3.  
  4. <form action="reg.php" method="post">
  5. Login: <input type="text" name="login"><br>
  6. Hasło: <input type="password" name="passwd"><br>
  7. E-mail: <input type="text" name="email"><br>
  8. <input type="submit" name="register" value="Zarejestruj">
  9. </form>
  10.  
  11. <?php
  12. class User
  13. {
  14. private $_login;
  15. private $_passwd;
  16. private $_email;
  17. private $_ip;
  18.  
  19. public function __get ($name)
  20. {
  21. return $this->getValue($name);
  22. }
  23.  
  24. public function __construct ($login,$passwd,$email,$ip)
  25. {
  26. $this->_login = $login;
  27. $this->_passwd = $passwd;
  28. $this->_email = $email;
  29. $this->_ip = $ip;
  30. }
  31.  
  32. public function getValue ($name)
  33. {
  34. return $this->$name;
  35. }
  36.  
  37. public function auth1 ()
  38. {
  39. if ((strlen($this->_login) < 3) or (strlen($this->_login) > 20)) die('Login musi mieć min. 3 i maks. 20 znaków');
  40. if (strlen($this->_passwd) < 6) die('Hasło musi mieć min. 6 znaków');
  41. if (!preg_match('/^[A-Za-z0-9\.\_\-]+\@[a-z0-9]+\.[a-z]{2,4}$/D',$this->_email)) die('Niepoprawny e-mail');
  42. }
  43.  
  44. public function auth2 ()
  45. {
  46. $pdo = new PDO('mysql:host=localhost;dbname=DBNAME', 'LOGIN', 'HASLO');
  47. $stmt=$pdo->query("SELECT login FROM users WHERE login='$this->_login'");
  48. $res=$stmt->fetch(PDO::FETCH_ASSOC);
  49. $stmt->closeCursor();
  50. if ($res > 0) die('Ten login jest już zajęty');
  51.  
  52. $stmt=$pdo->query("SELECT email FROM users WHERE email='$this->_email'");
  53. $res=$stmt->fetch(PDO::FETCH_ASSOC);
  54. $stmt->closeCursor();
  55. if ($res > 0) die('Ten e-mail jest już zajęty');
  56. }
  57.  
  58. public function addUser ()
  59. {
  60. $pdo = new PDO('mysql:host=localhost;dbname=DBNAME', 'LOGIN', 'HASLO');
  61. $stmt=$pdo->prepare('INSERT INTO users (login,passwd,email,ip) VALUES (:login,:passwd,:email,:ip)');
  62. $stmt->bindValue(':login',$this->_login,PDO::PARAM_STR);
  63. $stmt->bindValue(':passwd',sha1($this->_passwd),PDO::PARAM_STR);
  64. $stmt->bindValue(':email',$this->_email,PDO::PARAM_STR);
  65. $stmt->bindValue(':ip',$this->_ip,PDO::PARAM_STR);
  66. $num=$stmt->execute();
  67. }
  68. }
  69.  
  70. if (isset($_POST['register']))
  71. {
  72. $user = new User(strip_tags(trim($_POST['login'])),$_POST['passwd'],strip_tags(trim($_POST['email'])),$_SERVER['REMOTE_ADDR']);
  73. $user->auth1();
  74. $user->auth2();
  75. $user->addUser();
  76. echo 'Rejestracja ukonczona.';
  77. }

main.php
  1. <?php ob_start() ?>
  2.  
  3. <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  4.  
  5. <?php
  6. if (!isset($_SESSION['id'])) die('Taka sesja nie istnieje!');
  7.  
  8. if (!isset($_SESSION['init']))
  9. {
  10. $_SESSION['init'] = true;
  11. }
  12.  
  13. echo 'Witaj '.$_SESSION['login'].' ';
  14. echo '<a href="main.php?action=0">wyloguj</a>';
  15.  
  16. if (isset($_GET['action']))
  17. {
  18. switch ($_GET['action'])
  19. {
  20. case 0:
  21. unset($_SESSION['id']);
  22. unset($_SESSION['login']);
  23. header('Location: index.php');
  24. break;
  25. }
  26. }
  27. ?>


PS: głupi problem ale co zrobic zebym nie musiał pisac $pdo = new PDO(...) w kazdej metodzie w ktorej potrzebuje wykonac zapytanie do bazy? np. w reg.php wpisuje to samo w metodzie auth2 i addUser. gdy chcialem wrzucic to do konstruktora to byl problem taki, ze te dwie metody nie wiedzialy czym jest $pdo w wyrazeniu $stmt=$pdo.. tak wiec jak to obejsc?
nospor
1) Skoro używasz PDO to korzystaj z dobrodziejstwa jakim jest BINDOWANIE. Teraz Twój skrypt jest podatny na banalny SQL INJECTION
2) Nie możesz od tak sobie używać DIE dla wyświetlenie błędu. Całą obiektówkę właśnie szlag trafił
3) PDO inicjalizuj tylko raz a potem używaj tam gdzie chcesz
tab
Cytat(nospor @ 4.11.2012, 21:33:07 ) *
1) Skoro używasz PDO to korzystaj z dobrodziejstwa jakim jest BINDOWANIE. Teraz Twój skrypt jest podatny na banalny SQL INJECTION
2) Nie możesz od tak sobie używać DIE dla wyświetlenie błędu. Całą obiektówkę właśnie szlag trafił
3) PDO inicjalizuj tylko raz a potem używaj tam gdzie chcesz


1) tzn. w ktorym miejscu?
2) tak podejrzewalem ze to nie najlepsze wyjscie. a co bys proponował? return false na przyklad?
3) probowalem dac je do konstrukora, albo po prostu zainicjowac $pdo po kliknieciu submita ale wywala mi 'Call to a member function query() on a non-object'...
nospor
ad1) tzn zapoznaj się co to bindowanie a bedziesz wiedział w którym miejscu.
ad2) no return false na pewno bedzie lepsze smile.gif
ad3) widać źle używałes smile.gif
Pawel_W
ad1) używa w jednym miejscu, mianowicie addUser smile.gif
Dox
Przydała by się jeszcze pewnie w panelu logowania smile.gif


A ja mam pytanko jedno do czego służy funkcja

  1. public function getValue ($name)
  2. {
  3. return $this->$name;
  4. }



czy takie coś nie wystarczy ?

  1. public function __get ($name)
  2. {
  3. return $this->$name;
  4. }


ucze się oop i tak mnie to zastanawia tongue.gif
ShadowD
Wystarczy, ale niesie to za sobą poważne konsekwencje - brak podpowiadania składni np. w ide, nie wyobrażam sobie w zend'zie by coś takiego się pojawiało notorycznie, nie znam wszystkich metod i podpowiadanie w jakiś 95% pozwala mi "strzelać" nazwy i daje pożądany skutek. Poczytaj dlaczego nie poleca się magi w php.

Moim skromnym zdaniem takich fajerwerków jak __get() powinno się używać do danych które mogą ale nie muszą pojawić się w klasu, a skoro każdy instancja obiektu np. autoryzacji musi mieć login i hasło to lepiej dodać getNick() itd.
tab
to __get faktycznie jest niepotrzebne, nei wiem po co je dalem wink.gif

a co do problemu z pdo to wymysliem by przypisac je do pola klasy, czy to dobre rozwiazanie czy jest jakies lepsze?
sazian
po co tworzysz dwie osobne klasy i to jeszcze o tej samej nazwie
Helid
Jeśli już korzystasz z __get to utwórz tablicę $data i w niej trzymaj dane do których funkcja ma dostęp. Inaczej to bez sensu.
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.