Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Logowanie i zabezpieczenia
snerf
post
Post #1





Grupa: Zarejestrowani
Postów: 74
Pomógł: 3
Dołączył: 30.03.2014

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


Witam

napisałem sobie prosty skrypt logowania i starałem się zabezpieczyć sesję póki co się sprawdza lecz nwm czy to jest w pełni bezpieczne rozwiązanie:

  1. <?php
  2. class user{
  3. public $pdo;
  4. public $timeout; public $timeout_active;
  5. public $last_visit_time;
  6. public $prefix_mysql;
  7.  
  8. public function pdo($pdo, $time, $time_activ, $prefix_mysql)
  9. {
  10. $this->pdo = $pdo;
  11. $this->timeout = $time;
  12. $this->timeout_active = $time_activ;
  13. $this->prefix_mysql = $prefix_mysql;
  14. }
  15.  
  16. public function login($name, $password)
  17. {
  18. $pdo = $this->pdo;
  19. try{
  20. $password_sel = set_password($password);
  21. $stmt = $pdo -> prepare('SELECT id, password FROM `'.$this->prefix_mysql.users.'` WHERE username = :user OR email = :user LIMIT 1');
  22. $stmt -> bindValue(':user', $name, PDO::PARAM_STR);
  23. $stmt -> bindValue(':pass', $password_sel, PDO::PARAM_STR);
  24. $stmt -> execute();
  25. $count = $stmt->rowCount();
  26. }catch(PDOException $e){
  27. $display = 'Błąd zapytania:<br> ' . $e->getMessage();
  28. }
  29. $row = $stmt -> fetch();
  30. $user_id = $row['id'];
  31. if($count == 1){
  32. if(check_password($password, $row['password'])){
  33. $display = 'Zalogowano';
  34. $seskey = md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']);
  35. $this->last_visit_time = time()+$this->timeout_active;
  36. $stmt = $pdo -> prepare('UPDATE `'.$this->prefix_mysql.users.'` SET `session_key` = :seskey, `time_activ` = :date WHERE `id` = :user_id');
  37. $stmt -> bindValue(':date', $this->last_visit_time, PDO::PARAM_INT);
  38. $stmt -> bindValue(':seskey', $seskey, PDO::PARAM_STR);
  39. $stmt -> bindValue(':user_id', $user_id, PDO::PARAM_INT);
  40. $stmt->execute();
  41. $_SESSION['last_active'] = time();
  42. $_SESSION['owner_ses'] = $seskey;
  43. $_SESSION['user_id'] = $user_id;
  44. }else{
  45. $display = 'Dane nie prawidłowe.';
  46. }
  47. }else{
  48. $display = 'Takie konto nie istnieje.';
  49. }
  50. return $display;
  51. }
  52.  
  53. public function check($ost_activ)
  54. {
  55. if(!empty($_SESSION['user_id']) && !empty($_SESSION['owner_ses'])){
  56. $timeout = $this->timeout;
  57. $owner_ses = md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']);
  58.  
  59. if ((isset($_SESSION['last_active']) && $_SESSION['last_active']<(time()-$timeout))
  60. || (isset($_SESSION['owner_ses']) && $_SESSION['owner_ses']!=$owner_ses))
  61. {
  62. setcookie(session_name(), '', time()-3600, '/');
  63. header('Location: index.html');
  64. }else{
  65. $_SESSION['last_active'] = time();
  66. $_SESSION['owner_ses'] = $owner_ses;
  67. if($ost_activ < time()){
  68. $this->last_visit_time = time()+$this->timeout_active;
  69. $pdo = $this->pdo;
  70. $stmt = $pdo -> prepare('UPDATE `'.$this->prefix_mysql.users.'` SET `time_activ` = :date WHERE `id` = :user_id AND `session_key` = :seskey');
  71. $stmt -> bindValue(':date', $this->last_visit_time, PDO::PARAM_INT);
  72. $stmt -> bindValue(':seskey', $owner_ses, PDO::PARAM_STR);
  73. $stmt -> bindValue(':user_id', $_SESSION['user_id'], PDO::PARAM_INT);
  74. $stmt->execute();
  75. }
  76. }
  77. }
  78. }
  79. }
  80.  
  81. $user_class = new user;
  82. $user_class->pdo($pdo,$config['login_time'],$config['login_active_time'], $prefix_mysql);
  83.  
  84. $login = $user_class->login($_POST['email'], $_POST['password']);
  85.  
  86.  
  87. ?>


Jak jeszcze mogę zabezpieczyć logowanie? czy posiada jakieś błędy których nie zauważyłem? chciałbym być pewny przed wydaniem publicznie stronki.

mam nadzieje że to dobry dział, jak nie to przepraszam i prosze o poprawkę (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
snerf
post
Post #2





Grupa: Zarejestrowani
Postów: 74
Pomógł: 3
Dołączył: 30.03.2014

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


  1. $user_class->check($get_data['time_activ']); //Sprawdzam sesje
zapomniałem dodać...


a mam pytanie czy takie tworzenie dostępu jest poprawne?:
  1. public function get_permission($id)
  2. {
  3. $pdo = $this->pdo;
  4. $stmt = $pdo -> prepare('SELECT `'.$this->prefix_mysql.role_permission.'`.value, `'.$this->prefix_mysql.permissions.'`.string AS string FROM `'.$this->prefix_mysql.role_permission.'` LEFT JOIN `'.$this->prefix_mysql.permissions.'` ON `'.$this->prefix_mysql.role_permission.'`.id_permission = `'.$this->prefix_mysql.permissions.'`.id WHERE `'.$this->prefix_mysql.role_permission.'`.id_groups = :grupa');
  5. $stmt -> bindValue(':grupa', $id, PDO::PARAM_INT);
  6. $stmt -> execute();
  7. while($row = $stmt -> fetch()){
  8. $perm[$row['string']] = $row;
  9. }
  10. return $perm;
  11. }


Ładuje to tak:
  1. $get_perm = $user_class->get_permission($get_data['group']);



A wykorzystuje np w templatkach lub php tak:
  1. if($get_perm['access_edit']['value'] == 1){
  2. //it's works
  3. }



Czy jest to dobry sposób?
Go to the top of the page
+Quote Post

Posty w temacie


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: 5.10.2025 - 11:43