Bonjour

Etant novice en POO, je vous poste ici ma classe pour voir ce qui peux être amélioré... aussi bien au niveau du code lui même qu'au niveau de la logique.

J'utilise un token pour aider à identifier un utilisateur.
Je sais que le HTTP_USER_AGENT n'est pas une donnée, mais aucun des données des utilisateurs est sur et certain. Du coups je l'utilise plus comme une couche de sécurité mais pas LA sécurité.

Le grain de sel couvre la sécurité des mots de passes stocker dans la BDD.

Il manque un système de ban auto après x tentatives de connexion surement.

Merci pour vos idées !

Une table type
Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
CREATE TABLE IF NOT EXISTS `Users` (
  `id` int(10) NOT NULL auto_increment,
  `email` varchar(255) NOT NULL,
  `password` varchar(32) NOT NULL,
  `date_inscription` int(10) NOT NULL,
  `date_last_action` int(10) NOT NULL,
  `date_last_connexion` int(10) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Voici la classe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
<?php
/*
 * Class d'authentification
 * Version 0.2
 *
 * Date : 27/07/2010
 * Auteur : GUNNING Sky
 */
 
session_start();
 
class Auth {
 
    private $user = array();
    private $connected;
    private $user_table_name = 'Users';
    private $login_name;
    private $salt;
    private $password_name;
 
    public function __construct($salt='M:kJ5!1|WQ', $login_name='auth_login', $password_name='auth_password')
    {
        $this->login_name = $login_name;
        $this->password_name = $password_name;
        $this->salt = $salt;
 
        if($this->testConnexion() == false)
        {
            $this->connected = false;
        }
    }
 
 
    /*
     * Renvoi si cette personne est connecté ou pas
     */
    public function is_connected()
    {
        return ($this->connected) ? true : false;
    }
 
    /*
     * Connexion
     * $email : string (email)
     * $password : string non crypté (mot de passe)
     */
    public function connect($email, $password)
    {
        $email = mysql_real_escape_string($email);
 
        $sql = "SELECT id,email,password FROM `".$this->user_table_name."` WHERE `email` = '$email' AND `password` = '".md5($this->salt.$password)."' ";
        if(!$res = mysql_query($sql))
            exit('Erreur MySQL : Connexion impossible.');
 
        if (mysql_num_rows($res) == 1)
        {
            $this->connected = true;
            $this->user = mysql_fetch_assoc($res);
 
            $this->setSecuredData();
            $this->updateUser($this->user['id'], 1);
 
            return true;
        }
        else
            return false;
    }
 
 
    /*
     * Déconnexion
     */
    public function disconnect()
    {
        $this->resetSessionData();
 
        unset($_SESSION[ $this->password_name ]);
        unset($_SESSION[ $this->login_name ]);
        unset($_SESSION['token']);
    }
 
 
    // Fonctions privées
 
    /*
     * test la connexion en cours
     */
    private function testConnexion()
    {
        // def des vars à tester
        $toTestToken = '';
        $toTestPassword = '';
        $toTestLogin = '';
 
        // Conservation d'une connexion via cookie
        if (!empty($_COOKIE[ $this->login_name ]) && !empty($_COOKIE[ $this->password_name ]) && empty($_SESSION[ $this->password_name ])) {
            $toTestLogin = $_COOKIE[ $this->login_name ];
            $toTestPassword = $_COOKIE[ $this->password_name ];
            $toTestToken = $_COOKIE[ 'token' ];
        } elseif (!empty($_SESSION[ $this->password_name ]) && !empty($_SESSION[ $this->login_name ])) {
            $toTestLogin = $_SESSION[ $this->login_name ];
            $toTestPassword = $_SESSION[ $this->password_name ];
            $toTestToken = $_SESSION[ 'token' ];
        }
 
        // Si le token n'est pas identique au fingerprint du navigateur, on reset tout
        if($toTestToken != $this->fingerprint())
        {
            $this->resetSessionData();
            return false;
        }
 
        if (!empty($toTestLogin) && !empty($toTestPassword))
        {
            $email = mysql_real_escape_string($toTestLogin);
            $password = mysql_real_escape_string($toTestPassword);
 
            // test si l'utilisateur existe bien
            $sql = "SELECT id,email,password FROM `".$this->user_table_name."` WHERE `email`='$email' AND `password`='$password'";
            if(!$res = mysql_query($sql))
                exit('Erreur MySQL : Test de connexion impossible.');
 
            if (mysql_num_rows($res) == 1)
            {
                $this->connected = true;
                $this->user = mysql_fetch_assoc($res);
 
                // Si connexion depuis cookie :: on remet en place les sessions + cookies
                if (empty($_SESSION[ $this->password_name ]) || !empty($_SESSION[ $this->login_name ]))
                    $this->setSecuredData();
 
                $this->updateUser($this->user['id']);
 
                return true;
            }
            else
            {
                $this->resetSessionData();
                return false;
            }
        }
        else
            return false;
    }
 
    /*
     * Génère le token du navigateur en cours
     */
    private function fingerprint()
    {
        $fingerprint = $this->salt . $_SERVER['HTTP_USER_AGENT'];
        $token = md5($fingerprint . session_id());
 
        return $token;
    }
 
    /*
     * On défini les variables d'identifications
     * token, login et mot de passe
     * !! obligation d'avoir défini $this->user avant de l'utiliser !!
     */
    private function setSecuredData()
    {
        // declaration des sessions
        $_SESSION[ $this->password_name ] = $this->user['password'];
        $_SESSION[ $this->login_name ] = $this->user['email'];
        $_SESSION['token'] = $this->fingerprint();
 
        // déclaration des cookies
        $peremptionCookies = time() + (3600 * 24 * 31); // 31 J
        setcookie( $this->login_name , $this->user['email'], $peremptionCookies, "/");
        setcookie( $this->password_name , $this->user['password'], $peremptionCookies, "/");
        setcookie( 'token' , $_SESSION['token'], $peremptionCookies, "/");
    }
 
    /*
     * Reset complet des variables d'identification
     * C'est une déconnexion
     */
    private function resetSessionData()
    {
        // declaration des sessions
        $_SESSION[ $this->password_name ] = '';
        $_SESSION[ $this->login_name ] = '';
        $_SESSION['token'] = '';
 
        // déclaration des cookies
        $peremptionCookies = time() - (3600 * 24 * 31 * 365); // - 1 an
        setcookie( $this->login_name , '', $peremptionCookies, "/");
        setcookie( $this->password_name , '', $peremptionCookies, "/");
        setcookie( 'token' , '', $peremptionCookies, "/");
 
        $this->connected = false;
        $this->user = array();
    }
 
    /*
     * Mise à jours de divers infos de connexion dans la BDD
     * $id : int du user
     * $connexion : 0 ou 1
     *     => 0 : test de connexion
     *     => 1 : connexion
     */
    private function updateUser($id, $connexion=0)
    {
        $lastactionTime = mktime();
 
        $addedReq = '';
        if($connexion == 1)
            $addedReq = ", date_last_connexion='$lastactionTime'";
 
        $sql = "UPDATE ".$this->user_table_name." SET date_last_action='$lastactionTime'$addedReq WHERE id='$id'";
        if(!mysql_query($sql))
            exit('Erreur MySQL : Impossible de mettre les informations de l\'utilisateur à jours.');
    }
 
}
?>