Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> obiektowy system autoryzacji
tab
post
Post #1





Grupa: Zarejestrowani
Postów: 75
Pomógł: 20
Dołączył: 8.10.2012

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


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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
Go to the top of the page
+Quote Post
tab
post
Post #3





Grupa: Zarejestrowani
Postów: 75
Pomógł: 20
Dołączył: 8.10.2012

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


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

Ten post edytował tab 4.11.2012, 21:45:26
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




ad1) tzn zapoznaj się co to bindowanie a bedziesz wiedział w którym miejscu.
ad2) no return false na pewno bedzie lepsze (IMG:style_emoticons/default/smile.gif)
ad3) widać źle używałes (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Pawel_W
post
Post #5





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


ad1) używa w jednym miejscu, mianowicie addUser (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Dox
post
Post #6





Grupa: Zarejestrowani
Postów: 10
Pomógł: 1
Dołączył: 16.01.2010

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


Przydała by się jeszcze pewnie w panelu logowania (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
ShadowD
post
Post #7





Grupa: Zarejestrowani
Postów: 1 333
Pomógł: 137
Dołączył: 25.03.2008
Skąd: jesteś??

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


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





Grupa: Zarejestrowani
Postów: 75
Pomógł: 20
Dołączył: 8.10.2012

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


to __get faktycznie jest niepotrzebne, nei wiem po co je dalem (IMG:style_emoticons/default/wink.gif)

a co do problemu z pdo to wymysliem by przypisac je do pola klasy, czy to dobre rozwiazanie czy jest jakies lepsze?
Go to the top of the page
+Quote Post
sazian
post
Post #9





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


po co tworzysz dwie osobne klasy i to jeszcze o tej samej nazwie
Go to the top of the page
+Quote Post
Helid
post
Post #10





Grupa: Zarejestrowani
Postów: 280
Pomógł: 20
Dołączył: 12.12.2007
Skąd: 127.0.0.1

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


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

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

 



RSS Aktualny czas: 17.09.2025 - 11:22