Bonjour à tous,
je me replonge un peu dans le code php que j'avais mis de coté pas mal de temps.
Je n'ai pas de problème particulier à ce stade mais j'aimerai avoir votre avis sur deux points:
- Est ce que j'ai bien compris selon vous les bases de la POO au regard du code ci-dessous ?
- Est ce que selon le code si dessous protège suffisement des injections SQL ? sinon pour quelle raison SVP ?
Voici le principe que j'ai adopté:
à la saisie d'un pseudo et d'un mot de passe dans un formulaire par un utilisateur, je vérifie par l'intermédiaire d'une classe (FormValidator) et d'expressions régulières que les caractères utilisés sont conformes à ma politique de login/passe.
Si les conditions sont respectées, j'ai une classe authentification (AuthVerif) chargée de vérifier la combinaison login/passe et de register une session si combinaison ok.
Voici mon code:
instanciation de mes classe:
Class FormValidator
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 <form action="/test" method="POST"> <div> <div><label for="pseudo">Pseudo: </label><input type="text" name="pseudo" id="pseudo" value="<?= isset($_POST['pseudo'])?$_POST['pseudo']:''?>"</div> <div><label for="passe">Passe: </label><input type="text" name="passe" id="passe"></div> <div><input type="submit"></div> </div> </form> <?php if ($_POST) { $form = new \mvc\models\FormValidator(); if($form->isNameValid($_POST['pseudo'],2,30) and $form->isPasswordValid($_POST['passe'])) { $auth = New \mvc\models\AuthVerif($_POST['pseudo'],$_POST['passe']); if($auth->isLoginMatchesPassword()) { if($auth->openSession()) { echo "Session démarrée"; } } } else { echo "Combinaison login/passe refusée"; } } ?>
Classe AuthVerif
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 namespace mvc\models; /** * permet de vérifier la saisie des formulaires * Class FormValidator * @package mvc\models */ class FormValidator extends Database { /** * FormValidator constructor. */ public function __construct() { parent::__construct(); } /** * permet de vérifier si la valeur est de type alpha uniquement * @param string $value valeur à tester * @return bool return true si alpha only */ private function isAlpha(string $value) { return preg_match("#^[a-zA-Z]+$#",$value)?true:false; } /** * permet de verifier si la valeur est de type numérique uniquement * @param string $value valeur à tester * @return bool return true si numérique only */ private function isNum(string $value) { return preg_match("#^[0-9]+$#",$value)?true:false; } private function contentNum(string $value) { return preg_match("#[0-9]+#",$value)?true:false; } /** * permet de vérifier si la valeur est de type alphanumérique uniquement * @param string $value valeur à tester * @return bool renvoie tru si alphanumérique only */ private function isAlphaNum(string $value) { return preg_match("#^[a-zA-Z0-9]+$#",$value)?true:false; } /** * permet de renvoyé true si une chaine contient uniquement des alpha en début et fin et qui peut comtenir tiret, virgule ou espace * @param string $value valeur à tester * @return bool renvoie tru si alphanumérique only */ private function isAlphaWithSpecialChar(string $value) { return preg_match("#^([a-zA-Z0-9]+)(([', -]{0,1})([a-zA-Z0-9]{1,}))*$#",$value)?true:false; } /** * permet de tester si la valeur fait au minimum un nombre donné de charactere * @param string $value valeur à tester * @param int $minChar nombre minimum de carctère souhaité * @return bool renvoie true si condition respectée */ private function minCharNumber(string $value, int $minChar) { return strlen($value)>=$minChar?true:false; } /** * permet de tester si la valeur fait au maximum un nombre donné de charactere * @param string $value valeur à tester * @param int $maxChar nombre maximum de caractère souhaité * @return bool renvoie true si condition respectée */ private function maxCharNumber(string $value, int $maxChar) { return strlen($value)<=$maxChar?true:false; } private function contentOneMajOrMore(string $value) { return preg_match("#[A-Z]+#",$value)?true:false; } private function contentOneMinOrMore(string $value) { return preg_match("#[a-z]+#",$value)?true:false; } private function contentOneSpecialChar(string $value) { return preg_match("#[@!&_\-\.\*\?\+\[\]\(\)\^\$]+#",$value)?true:false; } /** * permet de vérifier si la saisie d'un prénom est de type alpha et qu'elle respecte un nombre de charactère donné. il peut comporter des tirets, virgule ou espaces * @param string $value valeur du prénom à vérifier * @param int $minChar nombre minimum de charactère * @param int $maxChar nombre maximum de charactère * @return bool return true si conditions respectées */ public function isNameValid(string $value, int $minChar, int $maxChar) { return ($this->isAlphaWithSpecialChar($value)&&$this->minCharNumber($value,$minChar)&&$this->maxCharNumber($value,$maxChar))?true:false; } private function acceptInPassword($value) { return preg_match("#[a-zA-Z0-9@!&_\-\.\*\?\+\[\]\(\)\^\$]#",$value)?true:false; } public function isPasswordValid($value) { return ($this->contentOneMajOrMore($value) and $this->contentOneMinOrMore($value) and $this->acceptInPassword($value) and $this->contentOneSpecialChar($value))?true:false; } }
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 <?php namespace mvc\models; /** * permet de vérifier la saisie des formulaires * Class FormValidator * @package mvc\models */ class AuthVerif extends Database { private $pseudo; private $password; private $id; /** * AuthVerif constructor. */ public function __construct($pseudoValue,$passValue) { parent::__construct(); session_start(); $this->pseudo=$pseudoValue; $this->password=$passValue; } /** * vérifie si l'utilisateur existe dans la table * @param string $pseudoValue valeur à chercher dans le champs de la table * @return bool renvoie true si la valeur existe dans le champs de la table */ private function pseudoExistInDB() { $req=$this->query("SELECT * FROM membres WHERE pseudo = ?",[$this->pseudo]); return $res=$req->rowCount()!==0?true:false; } /** * vérifie si l'utilisateur existe et que le mot de passe correspond. Renvoie true si ok * @param string $loginValue valeur du login saisi * @param string $passValue valeur du mot de passe saisi * @return bool */ public function isLoginMatchesPassword() { if ($this->pseudoExistInDB()) { $req=$this->query("SELECT id,pass FROM membres WHERE pseudo=?",[$this->pseudo]); $res=$req->rowCount(); if ($res==1) { $data=$req->fetch(); if(password_verify($this->password,$data->pass)) { $this->id=$data->id; return true; } else { return false; } } else { return false; } } else { return false; } } public function openSession() { if(!is_null($this->id)) { $_SESSION["register"]=true; $_SESSION["pseudo"]=$this->pseudo; return true; } else { return false; } } }
Partager