Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: obiektowy system autoryzacji
Forum PHP.pl > Inne > Oceny
michat34
ucze sie oop, ale najlepiej sie chyba zawsze uczy na przykldach wiec postanowilem napisac w oop system autoryzacji, zapewne jest tu masa bledow i niedocogniec, wiec prosze bardziej zaawanwoanych uzytkownikow o wskazowki co poprawic:

  1. <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  2.  
  3. <?php
  4. class DB
  5. {
  6. protected function connectdb ()
  7. {
  8. try
  9. {
  10. $pdo = new PDO('mysql:host=localhost;dbname=michat34', 'michat34', 'mud305000');
  11. }
  12. catch(PDOException $e)
  13. {
  14. die('Nie udało się połączyć z bazą danych. Spróbuj ponownie później: '.$e->getMessage());
  15. }
  16. }
  17. }
  18.  
  19. class User extends DB
  20. {
  21. private $login;
  22. private $password;
  23. private $email;
  24.  
  25. public function __construct ($login,$password,$email)
  26. {
  27. $this->connectdb();
  28. $this->login = $login;
  29. $this->password = $password;
  30. $this->email = $email;
  31. } // end __construct();
  32.  
  33. static public function filtr ($item)
  34. {
  35. return (strip_tags(trim($item)));
  36. } // end filtr();
  37.  
  38. public function getValue ($value)
  39. {
  40. return $this->$value;
  41. } // end getValue();
  42.  
  43. public function check_login ()
  44. {
  45. if (!preg_match('/^[A-Za-z0-9]{3,20}$/',$this->login)) return false;
  46. return true;
  47. } // end check_login();
  48.  
  49. public function check_login2 ()
  50. {
  51. echo "LOGINL $this->login";
  52. $stmt=$pdo->query("SELECT id FROM users WHERE login='$this->login'");
  53. $res=$stmt->rowCount();
  54. $stmt->closeCursor();
  55. if ($res > 0) return false;
  56. return true;
  57. } // end check_login2();
  58.  
  59. public function check_password ()
  60. {
  61. if (((strlen($this->password)) < 6) || ((strlen($this->password)) > 40)) return false;
  62. return true;
  63. } // end check_password();
  64.  
  65. public function check_email ()
  66. {
  67. if (!preg_match('/^[A-Za-z0-9\.\-\_]+\@[a-z0-9]+\.[a-z]+$/',$this->email)) return false;
  68. return true;
  69. } // end check_email();
  70.  
  71. public function check_email2 ()
  72. {
  73. $stmt=$pdo->query("SELECT id FROM users WHERE email='$this->email'");
  74. $res=$stmt->rowCount();
  75. $stmt->closeCursor();
  76. if ($res > 0) return false;
  77. return true;
  78. } // end check_email2();
  79. }
  80.  
  81. // po kliknieciu przycisku rejestracji
  82. if (isset($_POST['reg']))
  83. {
  84. $login = $_POST['login'];
  85. $password = $_POST['password'];
  86. $email = $_POST['email'];
  87.  
  88. $login = User::filtr($login);
  89. $password = User::filtr($password);
  90. $email = User::filtr($email);
  91.  
  92. $user = new User($login,$password,$email);
  93. if (($user->check_login()) && ($user->check_login2()) && ($user->check_password()) && ($user->check_email()) && ($user->check_email2()))
  94. {
  95. $stmt=$pdo->prepare('INSERT INTO users (login,password,email,ip) VALUES (:login,:password,:email,:ip)');
  96. $stmt->bindValue(':login',$user->getValue($login),PDO::PARAM_STR);
  97. $stmt->bindValue(':password',$user->getValue($password),PDO::PARAM_STR);
  98. $stmt->bindValue(':email',$user->getValue($email),PDO::PARAM_STR);
  99. $stmt->bindValue(':ip',$_SERVER['REMOTE_ADDR'],PDO::PARAM_STR);
  100. $num=$stmt->execute();
  101. } else
  102. {
  103. echo '<p>Nieprawidlowe dane:</p>';
  104. echo '<ul>';
  105. if (($user->check_login()) == false) echo '<li>Zły login</li>';
  106. if (($user->check_login2()) == false) echo '<li>Zajęty login</li>';
  107. if (($user->check_password()) == false) echo '<li>Złe hasło</li>';
  108. if (($user->check_email()) == false) echo '<li>Zły e-mail</li>';
  109. if (($user->check_emai2()) == false) echo '<li>Zajęty e-mail</li>';
  110. echo '</ul>';
  111. }
  112. }
  113. ?>
  114.  
  115. <form action="index.php" method="post">
  116. <table>
  117. <tr><td>Login:</td><td><input type="text" name="login" id="login"></td></tr>
  118. <tr><td>Hasło:</td><td><input type="password" name="password" id="password"></td></tr>
  119. <tr><td>E-mail:</td><td><input type="text" name="email" id="email"></td></tr>
  120. </table>
  121. <input type="submit" name="reg" value="Rejestracja">
  122. </form>
redeemer
Dałeś przykład, jak korzystając z PDO zostawić niespodzianke w postacji SQL Injection (check_login2, check_email2). Działa to w ogóle? Po szybkim zerknięciu nie wydaje mi się: $stmt->bindValue(':login',$user->getValue($login),PDO::PARAM_STR);
Zielonkawy18
Zawsze wydawało mi się, że konstruktor powinien mieć taką samą nazwę jak nazwa klasy:

  1. class User
  2. {
  3. User();
  4. }


Ogólnie fajnie, że obiektowo to napisałeś. Mnie się podoba. I sam chętnie poczytam sugestie.

Cytat(redeemer @ 31.10.2012, 10:45:45 ) *
Dałeś przykład, jak korzystając z PDO zostawić niespodzianke w postacji SQL Injection (check_login2, check_email2).


Możesz sprecyzować? Chętnie to wezme do siebie bo wiele jest w internecie o SQL Injection, ale o ochronie już niezbyt.
usb2.0
a mi się wydawało że konstruktor nie powinien mieć nazwy jak nazwa klasy
czytaj w php4 moze i tak, nie wiem kolego z czego się uczyłeśwink.gif
Zielonkawy18
Odniosłem się do języków desktopowych np. C#.
tab
Cytat(Zielonkawy18 @ 31.10.2012, 16:01:50 ) *
Zawsze wydawało mi się, że konstruktor powinien mieć taką samą nazwę jak nazwa klasy:


w php 4 tak było wink.gif w obecnych wersjach uzywa sie __construct() mimo ze nadal skrypt przyjmuje nazwe taka jak klasa. ale ma to zostac usuniete w php 6, wiec nalezy korzystac tylko z __construct()
Damonsson
Korzystając z MySQL podawanie parametrów PDO::PARAM_STR czy też PDO::PARAM_INT - nie ma żadnego sensu.
michat34
@up moglbys rozwinac?
Damonsson
Polecam ten temat, masz super wyjaśnione:

http://stackoverflow.com/questions/833510/...ow-does-it-work

Generalnie chodzi o to, że w MySQL sam definiujesz typ danych danej kolumny, na poziomie projektowania bazy. I te wartości z param nie są brane pod uwagę, jedynie jeśli określisz parametr BOOL a podasz do bazy INT to jest konwertowane bodajże, do BOOL.

Ale dokładnie masz wszystko tam opisane.
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.