Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Klasa logowania usera
michalboss
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 31.07.2015

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


Witam

Napisałem taką klasę logowania użytkownika w systemie.
Nie jest jeszcze skończona, ale chciałem prosić o ewentualne wskazanie błędów w w/w kodzie, ponieważ dopiero zaczynam OOP w php.

  1. <?php
  2.  
  3. class Login
  4. {
  5.  
  6. private $_dbh;
  7. private $_config;
  8. private $_lang;
  9. private $_isLoggin = FALSE;
  10. private $_idSession;
  11. private $_email;
  12. private $_password;
  13.  
  14. public function __construct($dbh, $config, $lang)
  15. {
  16. $this -> _dbh = $dbh;
  17. $this -> _config = $config;
  18. $this -> _lang = $lang;
  19. }
  20.  
  21. /**
  22.   * Metoda sprawdza czy user jest zalogowany w systemie
  23.   *
  24.   * @access public
  25.   * @return bool
  26.   */
  27. public function checkLoggin()
  28. {
  29. return $this -> _isLoggin;
  30. }
  31.  
  32. /**
  33.   * Metoda sprawdza czy istnieją zmienne sesyjne - jeśli tak, to loguje usera w klasie
  34.   *
  35.   * @access public
  36.   * @return bool
  37.   */
  38. protected function isLoggin()
  39. {
  40. if($_SESSION['isLoggin'] == TRUE)
  41. {
  42. $this -> _isLoggin = $_SESSION['isLoggin'];
  43. $this -> _idSession = session_id();
  44. $this -> _email = $_SESSION['email'];
  45. return TRUE;
  46. }
  47. else
  48. {
  49. return FALSE;
  50. }
  51. }
  52.  
  53. /**
  54.   * Metoda logowania - sprawdzania czy użytkownik jest zalogowany i czy istnieją zmienne formularza logowania
  55.   * Jeśli tak, to sprawdza w bazie poprawność e-mail oraz hasła i dokonuje logowania w systemie
  56.   *
  57.   * @access public
  58.   * @return void
  59.   */
  60. public function userLogin()
  61. {
  62. $errorMsg = '';
  63. if(!($this -> _isLoggin) && isset($_POST['logEmail']) && isset($_POST['logPassword']))
  64. {
  65. $sql = $this -> _dbh -> prepare('SELECT A.IdUser, A.Email, A.Password, A.Salt, A.FirstName, A.LastName, A.ErrorLogin, A.ErrorLoginTime, A.Current '
  66. . 'FROM `users` A '
  67. . 'WHERE A.Email=:email LIMIT 1');
  68. $sql -> bindValue(':email', $_POST['logEmail'], PDO::PARAM_STR);
  69. $sql -> execute();
  70. if($sql -> rowCount() > 0)
  71. {
  72. if($row = $sql -> fetch())
  73. {
  74. if(self::encode($_POST['logPassword'], $row['Salt']) == $row['Password'])
  75. {
  76. $_SESSION['isLoggin'] = TRUE;
  77. $_SESSION['email'] = $row['Email'];
  78. $_SESSION['IdUser'] = $row['IdUser'];
  79. $this -> isLoggin();
  80. }
  81. else
  82. {
  83. $errorMsg = $this -> _lang['errorLogin'];
  84. }
  85. }
  86. }
  87. else
  88. {
  89. $errorMsg = $this -> _lang['errorLogin'];
  90. }
  91.  
  92. if(!empty($errorMsg))
  93. {
  94. throw new Exception($errorMsg);
  95. }
  96. }
  97. else if(!($this -> _isLoggin) && isset($_SESSION['isLoggin']) && $_SESSION['isLoggin'] == TRUE)
  98. {
  99. $this -> isLoggin();
  100. }
  101. }
  102.  
  103. /**
  104.   * Metoda wylogowuje uzytkownika i usuwa sesję
  105.   *
  106.   * @access public
  107.   * @return void
  108.   */
  109. public function userLogout()
  110. {
  111. unset($_SESSION);
  112. unset($this -> _isLoggin);
  113. unset($this -> _idSession);
  114. unset($this -> _email);
  115. header("Location: index.php?msg=logout");
  116. }
  117.  
  118. /**
  119.   * Metoda hashuje hasło używając podanej soli z kartoteki usera
  120.   *
  121.   * @access public
  122.   * @param string $Password
  123.   * @param string $Salt
  124.   * @return string
  125.   */
  126. public static function encode($Password, $Salt)
  127. {
  128. return hash('sha256', $Salt . hash('sha256', $Password . $Salt));
  129. }
  130.  
  131. /**
  132.   * Metoda tworzy sól podanego hasła
  133.   *
  134.   * @access public
  135.   * @param string $Password
  136.   * @return string
  137.   */
  138. public static function salt($Password)
  139. {
  140. return substr(hash('sha256', microtime() . substr($Password, 0, 3)), 0, 5);
  141. }
  142.  
  143. public static function timemicro()
  144. {
  145. list($z1, $se) = explode(" ", microtime());
  146. return ((float) $z1 + (float) $se);
  147. }
  148.  
  149. }
  150. ?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
michalboss
post
Post #2





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 31.07.2015

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


Trochę zmieniłem kod klasy - może to jest trochę bardziej prawidłowe od poprzedniego?
Jeśli chodzi o metody statyczne to zdefiniowałem je aby także użyć w innych klasach jak user -> rejestracja.

  1. <?php
  2.  
  3. class Login
  4. {
  5.  
  6. private $dbh;
  7. private $config;
  8. private $lang;
  9. private $isLogged = FALSE;
  10. private $idSession;
  11. private $email;
  12. private $idUser;
  13.  
  14. public function __construct($dbh, $config, $lang)
  15. {
  16. $this->dbh = $dbh;
  17. $this->config = $config;
  18. $this->lang = $lang;
  19. }
  20.  
  21. /**
  22.   * Metoda sprawdza czy user jest zalogowany w systemie
  23.   *
  24.   * @access public
  25.   * @return bool
  26.   */
  27. public function checkLogged()
  28. {
  29. return $this->isLogged;
  30. }
  31.  
  32. /**
  33.   * Metoda sprawdza czy uzytkownik jest zalogowany (w klasie) - jeśli tak, to zapisuje dane z klasy do sesji
  34.   *
  35.   * @access public
  36.   * @return bool
  37.   */
  38. protected function setSessionData()
  39. {
  40. if($this->isLogged == TRUE)
  41. {
  42. $_SESSION['isLogged'] = $this->isLogged;
  43. $_SESSION['idUser'] = $this->idUser;
  44. $_SESSION['email'] = $this->email;
  45. }
  46. }
  47.  
  48. /**
  49.   * Metoda sprawdza czy uzytkownik jest zalogowany (sesję) - jeśli tak, to zapisuje dane z sesji do klasy
  50.   *
  51.   * @access public
  52.   * @return bool
  53.   */
  54. protected function getSessionData()
  55. {
  56. if(isset($_SESSION['isLogged']) && $_SESSION['isLogged'] == TRUE)
  57. {
  58. $this->isLogged = $_SESSION['isLogged'];
  59. $this->idUser = $_SESSION['idUser'];
  60. $this->email = $_SESSION['email'];
  61. $this->idSession = session_id();
  62. }
  63. }
  64.  
  65. /**
  66.   * Metoda logowania - sprawdza czy użytkownik nie jest już zalogowany i czy istnieją zmienne formularza logowania
  67.   * Jeśli tak, to sprawdza w bazie poprawność e-mail oraz hasła i dokonuje logowania w systemie
  68.   * Sprawdzana jest także ilość błędnych logowań - max 5 oraz czas od pierwszego błędnego logowania.
  69.   *
  70.   * @access public
  71.   * @return void
  72.   */
  73. public function userLogin()
  74. {
  75. $errorMsg = '';
  76. if(!($this->isLogged) && isset($_POST['logEmail']) && isset($_POST['logPassword']))
  77. {
  78. $sql = $this->dbh->prepare('SELECT A.IdUser, A.Email, A.Password, A.Salt, A.FirstName, A.LastName, A.ErrorLogin, A.ErrorLoginTime, A.Current '
  79. . 'FROM `users` A '
  80. . 'WHERE A.Email=:email LIMIT 1');
  81. $sql->bindValue(':email', $_POST['logEmail'], PDO::PARAM_STR);
  82. $sql->execute();
  83. if($sql->rowCount() > 0)
  84. {
  85. if($row = $sql->fetch())
  86. {
  87. $timeActual = strtotime(date("Y-m-d H:i:s"));
  88. $timeLogin = strtotime($row['ErrorLoginTime']);
  89. $timeCheck = $timeActual - $timeLogin;
  90. $timeCheckMin = round(60 - ($timeCheck / 60), 0);
  91.  
  92. if(self::decode($_POST['logPassword'], $row['Password']) == TRUE)
  93. {
  94. if($row['Current'] == 0)
  95. {
  96. $errorMsg = $this->lang['errorLoginCurrentError'];
  97. }
  98. else if($row['ErrorLogin'] >= 5 && ($timeCheck <= 3600))
  99. {
  100. $errorMsg = $this->lang['errorLoginTime'] . ' ' . $timeCheckMin . ' min.';
  101. }
  102. else
  103. {
  104. $this->isLogged = TRUE;
  105. $this->email = $row['Email'];
  106. $this->idUser = $row['IdUser'];
  107. $this->idSession = session_id();
  108. $this->setSessionData();
  109. if($row['ErrorLogin'] > 0 || $row['ErrorLoginTime'] != NULL)
  110. {
  111. $this->resetErrorLogin();
  112. }
  113. }
  114. }
  115. else
  116. {
  117. if($row['ErrorLogin'] >= 5 && ($timeCheck <= 3600))
  118. {
  119. $errorMsg = $this->lang['errorLoginTime'] . ' ' . $timeCheckMin . ' min.';
  120. }
  121. else
  122. {
  123. $this->updateErrorLogin($_POST['logEmail']);
  124. $errorMsg = $this->lang['errorLogin'];
  125. }
  126. }
  127. }
  128. }
  129. else
  130. {
  131. $this->updateErrorLogin($_POST['logEmail']);
  132. $errorMsg = $this->lang['errorLogin'];
  133. }
  134.  
  135. if(!empty($errorMsg))
  136. {
  137. throw new Exception($errorMsg);
  138. }
  139. }
  140. else if(!($this->isLogged) && isset($_SESSION['isLogged']) && $_SESSION['isLogged'] == TRUE)
  141. {
  142. $this->getSessionData();
  143. }
  144. }
  145.  
  146. /**
  147.   * Metoda resetuje ilośc błędów logowania oraz czas,
  148.   * dla użytkownika, w przypadku powodzenia logowania
  149.   *
  150.   * @access public
  151.   * @return void
  152.   */
  153. protected function resetErrorLogin()
  154. {
  155. $sql2 = $this->dbh->prepare('UPDATE `users` SET ErrorLogin = 0, ErrorLoginTime = NULL '
  156. . 'WHERE Email=:email');
  157. $sql2->bindValue(':email', $this->email, PDO::PARAM_STR);
  158. $sql2->execute();
  159. }
  160.  
  161. /**
  162.   * Metoda zwiększa ilośc błędnych logowań oraz zapisuje czas pierwszego błednego logowania
  163.   *
  164.   * @access public
  165.   * @return void
  166.   */
  167. protected function updateErrorLogin($logEmail)
  168. {
  169. $sql2 = $this->dbh->prepare('UPDATE `users` SET '
  170. . 'ErrorLogin = ErrorLogin+1, '
  171. . 'ErrorLoginTime = if(ErrorLoginTime IS NULL, \'' . date("Y-m-d H:i:s") . '\', ErrorLoginTime) '
  172. . 'WHERE Email=:email');
  173. $sql2->bindValue(':email', $logEmail, PDO::PARAM_STR);
  174. $sql2->execute();
  175. }
  176.  
  177. /**
  178.   * Metoda wylogowuje uzytkownika, niszczy sesję i usuwa dane
  179.   *
  180.   * @access public
  181.   * @return void
  182.   */
  183. public function userLogout()
  184. {
  185. unset($_SESSION);
  186. unset($this->isLogged);
  187. unset($this->idSession);
  188. unset($this->email);
  189. unset($this->idUser);
  190. header("Location: index.php?msg=logout");
  191. }
  192.  
  193. /**
  194.   * Metoda hashuje hasło używając podanej soli z kartoteki usera
  195.   *
  196.   * @access public
  197.   * @param string $Password
  198.   * @param string $Salt
  199.   * @return string
  200.   */
  201. public static function encode($password, $salt, $rounds = 10000)
  202. {
  203. // pass in the password, the number of rounds, and the salt
  204. // $5$ specifies SHA256-CRYPT, use $6$ if you really want SHA512
  205. return crypt($password, sprintf('$6$rounds=%d$%s$', $rounds, $salt));
  206. }
  207.  
  208. /**
  209.   * Metoda rozszyfrowuje podane hasło
  210.   *
  211.   * @access public
  212.   * @param string $Password
  213.   * @param string $Salt
  214.   * @return string
  215.   */
  216. public static function decode($password, $dbPassword)
  217. {
  218. // extract the hashing method, number of rounds, and salt from the stored hash
  219. // and hash the password string accordingly
  220. $parts = explode('$', $dbPassword);
  221. $testPassword = crypt($password, sprintf('$%s$%s$%s$', $parts[1], $parts[2], $parts[3]));
  222. return ($dbPassword === $testPassword) ? TURE : FALSE;
  223. }
  224.  
  225. /**
  226.   * Metoda tworzenia 16-znakowej soli
  227.   *
  228.   * @access public
  229.   * @return string
  230.   */
  231. public static function salt()
  232. {
  233. //return substr(hash('sha256', microtime() . substr($Password, 0, 3)), 0, 5);
  234. return substr(str_replace('+','.',base64_encode(md5(mt_rand(), true))),0,16);
  235. }
  236. }
  237. ?>
Go to the top of the page
+Quote Post

Posty w temacie
- michalboss   Klasa logowania usera   31.07.2015, 20:26:06
- - Damonsson   Żeby było szybciej napiszę co jest dobrze: nic. Ni...   31.07.2015, 20:48:38
|- - audiodesign10   Cytat(Damonsson @ 31.07.2015, 21:48:3...   3.08.2015, 21:00:29
|- - Damonsson   Cytat(audiodesign10 @ 3.08.2015, 22:00...   4.08.2015, 12:05:15
- - CuteOne   Szybkie code review: 1. [PHP] pobierz, plaintext ...   31.07.2015, 21:49:02
- - michalboss   Dzięki za odp - poprawię ten kod i dam jeszcze raz...   1.08.2015, 09:20:15
- - Skie   2. Tutaj koledze chodziło o to, że nazwy metod jak...   1.08.2015, 13:55:48
|- - Damonsson   Cytat(Skie @ 1.08.2015, 14:55:48 ) Ta...   1.08.2015, 14:32:38
- - michalboss   To chyba najlepiej podwójne hashowanie sola z bazy...   1.08.2015, 18:51:37
- - Pyton_000   A nie lepiej użyć jednego kodowania ale mocnego? D...   1.08.2015, 18:58:44
- - Skie   CytatDlatego jestem zwolennikiem trzymania soli za...   1.08.2015, 20:29:07
|- - borabora   Cytat(Skie @ 1.08.2015, 21:29:07 ) Be...   1.08.2015, 20:40:56
- - michalboss   Trochę zmieniłem kod klasy - może to jest trochę b...   1.08.2015, 21:11:23
- - CuteOne   Już trochę lepiej to wygląda ale gdybyś pracował j...   1.08.2015, 22:53:13
- - michalboss   Z tego co piszesz to rozumiem że lepiej zrobić zam...   3.08.2015, 11:00:21
- - marcio   Jesli chcesz spojrz na moja klase do logowania nie...   3.08.2015, 12:15:59
- - Pyton_000   I jest równie fatalnie napisana co autora wątku.   3.08.2015, 12:50:24
- - marcio   Cytat(Pyton_000 @ 3.08.2015, 13:50:24...   3.08.2015, 18:06:58
- - Pyton_000   A kto powiedział że takową mam. Ja nie wymyślam ko...   3.08.2015, 18:55:57
- - marcio   Cytat(Pyton_000 @ 3.08.2015, 19:55:57...   4.08.2015, 09:06:32
|- - !*!   Cytat(marcio @ 4.08.2015, 10:06:32 ) ...   4.08.2015, 11:24:38
- - marcio   Cytat(Damonsson @ 4.08.2015, 13:05:15...   4.08.2015, 13:14:54
|- - Damonsson   Cytat(marcio @ 4.08.2015, 14:14:54 ) ...   4.08.2015, 16:38:58
- - viking   Najlepiej podpatrzeć jak to robią duzi: https://gi...   4.08.2015, 14:15:56
- - pyro   Niewymyślanie koła na nowo to teraz oznaka lenistw...   4.08.2015, 17:40:05
- - marcio   Cytat(Damonsson @ 4.08.2015, 17:38:58...   5.08.2015, 10:47:20
- - Pyton_000   Zawsze możesz iść na inne gdzie będziesz się lepie...   5.08.2015, 11:12:43
- - marcio   Cytat(pyro @ 4.08.2015, 18:40:05 ) Ni...   5.08.2015, 17:04:04
- - MESSIAH :)   Dokładnie też to zauważyłem. Jeszcze Comandeer pró...   6.08.2015, 20:15:00
|- - Ksar   Offtopując. Cytat(MESSIAH :) @ 6.08....   6.08.2015, 22:26:31
|- - Damonsson   Skoro moderatorzy nie reagują na raporty, znaczy, ...   6.08.2015, 22:37:55
|- - Ksar   Cytat(Damonsson @ 6.08.2015, 23:37:55...   6.08.2015, 22:42:56
- - com   MESSIAH no bez jaj, pomaganie !== zrobienie z...   6.08.2015, 21:30:38
- - com   Róbcie co się wam podoba tylko jak ktoś przychodzi...   6.08.2015, 22:36:33
- - com   bo robienie czegoś co już jest i dawanie tego do o...   6.08.2015, 22:51:33
- - marcio   @Damonsson: Cytatktóre napisalibyśmy w 95% tak sam...   7.08.2015, 16:07:29
|- - !*!   Cytat(marcio @ 7.08.2015, 17:07:29 ) ...   7.08.2015, 17:25:19
|- - MESSIAH :)   Cytat(!*! @ 7.08.2015, 18:25...   7.08.2015, 19:43:30
- - memory   przecież dostałeś odpowiedź o co ci teraz chodzi?   7.08.2015, 20:04:47
- - CuteOne   @MESSIAH jeżeli tamten temat wyglądał jak ten Tem...   7.08.2015, 20:10:45
- - Daiquiri   Ludziska skończcie proszę te wycieczki osobiste - ...   8.08.2015, 08:42:57
- - marcio   CytatPrzecież już Ci wyjaśnił że nie, ponieważ nie...   8.08.2015, 12:05:01
|- - !*!   Cytat(marcio @ 8.08.2015, 13:05:01 ) ...   8.08.2015, 12:28:06
- - Daiquiri   !*!, Marcio - nie zaśmiecajcie już tematu.   8.08.2015, 12:56:36


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: 15.10.2025 - 21:31