summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2022-07-26 01:47:53 +0200
committerpolo <ordipolo@gmx.fr>2022-07-26 01:47:53 +0200
commit8681ecc6f83507861899a8bcae21850dfc5e61d2 (patch)
tree4414dafb2be493125b57437af07041ca2814b7b1
parent251a6926a1a09e4cc9da1b4f91be7c3a8283bf3f (diff)
downloadmelaine-8681ecc6f83507861899a8bcae21850dfc5e61d2.zip
captcha
-rw-r--r--controller/Security.php3
-rw-r--r--controller/installation.php2
-rw-r--r--controller/password.php148
-rw-r--r--controller/visitor.php1
-rw-r--r--model/Article.php1
-rw-r--r--public/css/accueil.css5
-rw-r--r--view/password.php43
-rw-r--r--à faire après livraison.txt2
8 files changed, 154 insertions, 51 deletions
diff --git a/controller/Security.php b/controller/Security.php
index ac1149e..c4724de 100644
--- a/controller/Security.php
+++ b/controller/Security.php
@@ -39,7 +39,8 @@ function fixLinks($data)
39 // regex pour détecter les balises <a> et ajouter http:// au début des liens si nécessaire 39 // regex pour détecter les balises <a> et ajouter http:// au début des liens si nécessaire
40 $pattern = '#(<a.*href=")((?!https?://).*)(".*>)#'; 40 $pattern = '#(<a.*href=")((?!https?://).*)(".*>)#';
41 $remplacement = '$1http://$2$3'; 41 $remplacement = '$1http://$2$3';
42 // le "while" est ici parce que preg_replace s'arrête après avec trouvé et modifié un pattern, pourquoi?? 42 // le "while" est ici parce que preg_replace s'arrête après avec matché une fois
43 // plus exactement, le .* à la fin fait que la chaine détectée va jusqu'à la fin des données (à corriger peut-être avec </a>)
43 while(preg_match($pattern, $data)) 44 while(preg_match($pattern, $data))
44 { 45 {
45 $data = preg_replace($pattern, $remplacement, $data); 46 $data = preg_replace($pattern, $remplacement, $data);
diff --git a/controller/installation.php b/controller/installation.php
index e99a06e..5aa5ac9 100644
--- a/controller/installation.php
+++ b/controller/installation.php
@@ -117,7 +117,7 @@ function installation()
117 } 117 }
118 118
119 // création d'un mot de passe si password.txt est vide 119 // création d'un mot de passe si password.txt est vide
120 createPassword(); 120 existPassword();
121} 121}
122 122
123function createIndexPHP($path, $droitsFichiers) 123function createIndexPHP($path, $droitsFichiers)
diff --git a/controller/password.php b/controller/password.php
index e739363..e01e4dd 100644
--- a/controller/password.php
+++ b/controller/password.php
@@ -1,8 +1,8 @@
1<?php 1<?php
2// controller/password.php 2// controller/password.php
3 3
4// affichage 4// fonction exécutée à l'ouverture de chaque page
5function createPassword() 5function existPassword()
6{ 6{
7 // création du fichier 7 // création du fichier
8 if(!file_exists('data/password.txt')) 8 if(!file_exists('data/password.txt'))
@@ -18,50 +18,110 @@ function createPassword()
18 echo('Erreur: ouverture du fichier password.txt impossible.'); 18 echo('Erreur: ouverture du fichier password.txt impossible.');
19 exit(); 19 exit();
20 } 20 }
21 21
22 // création du mot de passe
23 if(empty($hashedPassword)) 22 if(empty($hashedPassword))
24 { 23 {
25 // paranoïa? 24 createPassword();
26 if(isset($_SESSION['admin'])) 25 }
27 { 26}
28 unset($_SESSION['admin']); 27
29 header("Location: index.php"); 28
30 exit(); 29function createCaptcha(): array
31 } 30{
31 $a = rand(2, 10);
32 $b = rand(2, 10);
33 return array(toLettersFrench($a), toLettersFrench($b), $a * $b);
34}
35
36function toLettersFrench(int $number): string
37{
38 return match($number)
39 {
40 2 => 'deux',
41 3 => 'trois',
42 4 => 'quatre',
43 5 => 'cinq',
44 6 => 'six',
45 7 => 'sept',
46 8 => 'huit',
47 9 => 'neuf',
48 10 => 'dix',
49 };
50}
32 51
33 // au rechargement après saisi 52// vérifier qu'on a que des chiffres
53function controlCaptchaInput()
54{
55 //$_POST['captcha']
56}
57
58
59function createPassword()
60{
61 // paranoïa?
62 if(isset($_SESSION['admin']))
63 {
64 unset($_SESSION['admin']);
65 header("Location: index.php");
66 exit();
67 }
68
69 $captcha = createCaptcha();
70 require('view/password.php');
71
72 $title = 'Bienvenue Melaine Favennec';
73 $subHeading = 'Veuillez choisir le mot de passe que vous utiliserez pour gérer le site.';
74
75 // au rechargement après saisi
76 if(isset($_POST['motdepasse']) && !empty($_POST['motdepasse']) && isset($_POST['captcha']) && (int) $_POST['captcha'] == $_SESSION['captcha'])
77 {
78 // caractères non désirés supprimés
34 // impossible d'entrer un espace ou une tabulation et de valider par erreur 79 // impossible d'entrer un espace ou une tabulation et de valider par erreur
35 if(isset($_POST['motdepasse']) && !empty($_POST['motdepasse'])) 80 require('controller/Security.php');
36 { 81 $password = Security::secureString($_POST['motdepasse']);
37 // caractères non désirés supprimés 82 $password = removeSpacesTabsCRLF($_POST['motdepasse']);
38 require('controller/Security.php'); 83
39 $password = Security::secureString($_POST['motdepasse']);
40 $password = removeSpacesTabsCRLF($_POST['motdepasse']);
41 }
42 // enregistrement 84 // enregistrement
43 if(isset($password) && $password == $_POST['motdepasse']) 85 if(isset($password) && $password == $_POST['motdepasse'])
44 { 86 {
45 hashNewPassword($_POST['motdepasse']); 87 hashNewPassword($_POST['motdepasse']);
88 unset($_SESSION['captcha']); // nettoyage
46 header('Location: index.php'); 89 header('Location: index.php');
47 } 90 }
48 // 1ère fois 91 // mot de passe non valable
49 else 92 else
50 { 93 {
51 $title = 'Créer un mot de passe'; 94 sleep(1);
52 $subHeading = 'Veuillez choisir le mot de passe que vous utiliserez pour gérer le site.';
53
54 require('view/password.php');
55
56 echo($header); 95 echo($header);
57 echo($errorBadCharacters); 96 echo($errorPassword);
58 echo($formulaireNouveauMDP); 97 echo($formulaireNouveauMDP);
59 echo($warning); 98 echo($errorBadCharacters);
60 } 99 }
61 exit();
62 } 100 }
101 // mauvais captcha
102 elseif(isset($_POST['captcha']) && (int) $_POST['captcha'] != $_SESSION['captcha'])
103 {
104 sleep(1);
105 echo($header);
106 echo($errorCaptcha);
107 echo($formulaireNouveauMDP);
108 echo($errorBadCharacters);
109 }
110 // 1ère fois
111 else
112 {
113 echo($header);
114 echo($formulaireNouveauMDP);
115 echo($errorBadCharacters);
116 //echo($warning); // message pas top
117 }
118
119 // fois suivante (dispense de nettoyer la variable)
120 $_SESSION['captcha'] = $captcha[2];
121 exit();
63} 122}
64 123
124
65function connect() 125function connect()
66{ 126{
67 // déjà en mode admin 127 // déjà en mode admin
@@ -72,6 +132,7 @@ function connect()
72 } 132 }
73 133
74 // Ajouter une sécurité par cpatcha avec un "input" supplémentaire 134 // Ajouter une sécurité par cpatcha avec un "input" supplémentaire
135 $captcha = createCaptcha();
75 // Et créer une variable de session pour la réponse au CAPTCHA 136 // Et créer une variable de session pour la réponse au CAPTCHA
76 137
77 $title = "Connexion"; 138 $title = "Connexion";
@@ -82,20 +143,29 @@ function connect()
82 143
83 echo($header); 144 echo($header);
84 145
85 // bon mot de passe 146 // bon codes (mot de passe et captcha)
86 if(isset ($_POST["motdepasse"]) AND testPassword($_POST["motdepasse"])) 147 if(isset ($_POST["motdepasse"]) && testPassword($_POST["motdepasse"]) && isset($_POST['captcha']) && (int) $_POST['captcha'] == $_SESSION['captcha'])
87 { 148 {
88 $_SESSION['admin'] = 1; 149 $_SESSION['admin'] = 1;
150 unset($_SESSION['captcha']); // nettoyage
89 header('Location: index.php?page=' . $_GET['from']); 151 header('Location: index.php?page=' . $_GET['from']);
90 exit(); 152 exit();
91 } 153 }
92 154
93 // mauvais mot de passe 155 // mauvais captcha
94 elseif(isset ($_POST["motdepasse"]) AND !testPassword($_POST["motdepasse"])) 156 elseif(isset($_POST['captcha']) && (int) $_POST['captcha'] != $_SESSION['captcha'])
157 {
158 echo($errorCaptcha);
159 sleep(1);
160 echo($formulaireConnexion);
161 }
162
163 // mauvais codes
164 elseif(isset ($_POST["motdepasse"]) && !testPassword($_POST["motdepasse"]))
95 { 165 {
96 // défense aux attaques par force brute 166 // défense aux attaques par force brute
97 // pas parfait, ne marche pas si l'attaquant multiplie les connexions au site 167 // pas parfait, ne marche pas si l'attaquant multiplie les connexions au site
98 echo($erreurMDP); 168 echo($errorPassword);
99 sleep(1); 169 sleep(1);
100 echo($formulaireConnexion); 170 echo($formulaireConnexion);
101 } 171 }
@@ -106,6 +176,10 @@ function connect()
106 echo($formulaireConnexion); 176 echo($formulaireConnexion);
107 } 177 }
108 178
179 // fois suivante (dispense de nettoyer la variable)
180 $_SESSION['captcha'] = $captcha[2];
181
182 echo($messageDeconnect);
109 echo($footer); 183 echo($footer);
110} 184}
111 185
@@ -119,8 +193,6 @@ function changePassword()
119 exit(); 193 exit();
120 } 194 }
121 195
122 // Ajouter une sécurité par cpatcha avec un "input" supplémentaire
123 // Et créer une variable de session pour la réponse au CAPTCHA
124 $title = "Nouveau mot de passe"; 196 $title = "Nouveau mot de passe";
125 $subHeading = "Veuillez saisir votre actuel mot de passe suivi du nouveau."; 197 $subHeading = "Veuillez saisir votre actuel mot de passe suivi du nouveau.";
126 198
@@ -137,14 +209,14 @@ function changePassword()
137 209
138 // bon mot de passe 210 // bon mot de passe
139 if(isset($newPassword) && $newPassword === $_POST['nouveauMotdepasse'] 211 if(isset($newPassword) && $newPassword === $_POST['nouveauMotdepasse']
140 && isset ($_POST["ancienMotdepasse"]) AND testPassword($_POST["ancienMotdepasse"])) 212 && isset ($_POST["ancienMotdepasse"]) && testPassword($_POST["ancienMotdepasse"]))
141 { 213 {
142 // enregistrement et confirmation 214 // enregistrement et confirmation
143 hashNewPassword($_POST["nouveauMotdepasse"]); 215 hashNewPassword($_POST["nouveauMotdepasse"]);
144 echo($message); 216 echo($message);
145 } 217 }
146 // mauvais mot de passe 218 // mauvais mot de passe
147 elseif(isset ($_POST["ancienMotdepasse"]) AND !testPassword($_POST["ancienMotdepasse"])) 219 elseif(isset ($_POST["ancienMotdepasse"]) && !testPassword($_POST["ancienMotdepasse"]))
148 { 220 {
149 // défense aux attaques par force brute 221 // défense aux attaques par force brute
150 // pas parfait, ne marche pas si l'attaquant multiplie les connexions au site 222 // pas parfait, ne marche pas si l'attaquant multiplie les connexions au site
@@ -164,7 +236,7 @@ function changePassword()
164 echo($formulaireModifMDP); 236 echo($formulaireModifMDP);
165 } 237 }
166 238
167 echo($warning); 239 //echo($warning);
168 echo($footer); 240 echo($footer);
169} 241}
170 242
diff --git a/controller/visitor.php b/controller/visitor.php
index c561097..e0cd7fc 100644
--- a/controller/visitor.php
+++ b/controller/visitor.php
@@ -33,6 +33,7 @@ function pageArticlesSimplesVisitor(string $page, string $title, string $headerP
33 // données dans $Articles->fileList['content'] 33 // données dans $Articles->fileList['content']
34 $Articles->readAll(); 34 $Articles->readAll();
35 $Articles->fileList = array_reverse($Articles->fileList); 35 $Articles->fileList = array_reverse($Articles->fileList);
36 //var_dump($Articles->fileList[0]);
36 } 37 }
37 38
38 // Assemblage 39 // Assemblage
diff --git a/model/Article.php b/model/Article.php
index 0287562..24480ed 100644
--- a/model/Article.php
+++ b/model/Article.php
@@ -102,6 +102,7 @@ class Article
102 // read 102 // read
103 public function readAll() // ajoute le contenu à FileList 103 public function readAll() // ajoute le contenu à FileList
104 { 104 {
105 // lit du html ou du json si appelée depuis la classe Album
105 for($i = 0; $i < $this->fileListCount; $i++) 106 for($i = 0; $i < $this->fileListCount; $i++)
106 { 107 {
107 $this->fileList[$i]['content'] = file_get_contents($this->fileList[$i]['fileName']); 108 $this->fileList[$i]['content'] = file_get_contents($this->fileList[$i]['fileName']);
diff --git a/public/css/accueil.css b/public/css/accueil.css
index 087da86..e7f8413 100644
--- a/public/css/accueil.css
+++ b/public/css/accueil.css
@@ -186,6 +186,11 @@ form
186 margin-top: 0px; 186 margin-top: 0px;
187 text-align: center; 187 text-align: center;
188} 188}
189.connexionP
190{
191 margin: 20px;
192 text-align: center;
193}
189.avertissement 194.avertissement
190{ 195{
191 color: red; 196 color: red;
diff --git a/view/password.php b/view/password.php
index a5cdbf8..c52274e 100644
--- a/view/password.php
+++ b/view/password.php
@@ -4,28 +4,47 @@
4// ce fichier contient le HTML de deux pages du site: 4// ce fichier contient le HTML de deux pages du site:
5// - connexion au mode admin 5// - connexion au mode admin
6// - changement de mot de passe 6// - changement de mot de passe
7//
8// rajouter la page "créatio du mot de passe"?
7 9
8// formulaire création du mot de passe 10// insertion du captcha
9ob_start(); 11ob_start();
10?> 12?>
11 <form class="connexionFormulaire" method="post" action="index.php" > 13 <p>Montrez que vous n'êtes pas un robot.<br/>
14 <label for="captcha" >Combien font <?= $captcha[0] ?> fois <?= $captcha[1] ?>?</label>
15 <input required type="text" id="captcha" name="captcha" autocomplete="off" size="1" />
16 </p>
17<?php
18$captchaHtml = ob_get_clean();
19
20
21// formulaire connexion
22ob_start();
23?>
24 <form class="connexionFormulaire" method="post" action="index.php?page=connexion&from=<?= $_GET['from'] ?>" >
12 <label for="motdepasse" >Mot de passe:</label> 25 <label for="motdepasse" >Mot de passe:</label>
13 <input type="password" name="motdepasse" autofocus required > 26 <input type="password" name="motdepasse" autofocus required >
27
28 <?= $captchaHtml ?>
29
14 <input type="submit" value="Valider" > 30 <input type="submit" value="Valider" >
15 </form> 31 </form>
16<?php 32<?php
17$formulaireNouveauMDP = ob_get_clean(); 33$formulaireConnexion = ob_get_clean();
18 34
19// formulaire connexion 35// formulaire création du mot de passe
20ob_start(); 36ob_start();
21?> 37?>
22 <form class="connexionFormulaire" method="post" action="index.php?page=connexion&from=<?= $_GET['from'] ?>" > 38 <form class="connexionFormulaire" method="post" action="index.php" >
23 <label for="motdepasse" >Mot de passe:</label> 39 <label for="motdepasse" >Mot de passe:</label>
24 <input type="password" name="motdepasse" autofocus required > 40 <input type="password" name="motdepasse" autofocus required >
41
42 <?= $captchaHtml ?>
43
25 <input type="submit" value="Valider" > 44 <input type="submit" value="Valider" >
26 </form> 45 </form>
27<?php 46<?php
28$formulaireConnexion = ob_get_clean(); 47$formulaireNouveauMDP = ob_get_clean();
29 48
30// formulaire changement de mot de passe 49// formulaire changement de mot de passe
31// vérification de l'ancien et choix du nouveau à taper deux fois dont une à l'aveugle 50// vérification de l'ancien et choix du nouveau à taper deux fois dont une à l'aveugle
@@ -35,7 +54,7 @@ ob_start();
35 <label for="motdepasse" >Ancien mot de passe:</label> 54 <label for="motdepasse" >Ancien mot de passe:</label>
36 <input type="password" name="ancienMotdepasse" autofocus required ><br /><br /> 55 <input type="password" name="ancienMotdepasse" autofocus required ><br /><br />
37 <label for="motdepasse" >Nouveau mot de passe:</label> 56 <label for="motdepasse" >Nouveau mot de passe:</label>
38 <input type="password" name="nouveauMotdepasse" required > 57 <input type="password" name="nouveauMotdepasse" required autocomplete="off" >
39 <br /><br /> 58 <br /><br />
40 <input type="submit" value="Valider" > 59 <input type="submit" value="Valider" >
41 <a href="index.php?page=<?= $_GET['from'] ?>" > 60 <a href="index.php?page=<?= $_GET['from'] ?>" >
@@ -67,14 +86,16 @@ ob_start();
67 <body> 86 <body>
68 <div id="bloc_page" > 87 <div id="bloc_page" >
69 <h2 class="connexionTitre" ><?= $title ?></h2> 88 <h2 class="connexionTitre" ><?= $title ?></h2>
70 <p class="connexionTitre" ><?= $subHeading ?></p> 89 <p class="connexionP" ><?= $subHeading ?></p>
71<?php 90<?php
72$header = ob_get_clean(); 91$header = ob_get_clean();
73 92
74 93
75// messages d'erreur 94// messages d'erreur
76$errorPassword = '<p class="avertissement" >Mauvais mot de passe</p>'; 95$errorPassword = '<p class="avertissement" >Mauvais mot de passe</p>';
96$errorCaptcha = '<p class="avertissement" >Erreur au test anti-robot</p>';
77$errorBadCharacters = '<p class="avertissement" >Caractères interdits: espaces, tabulations, sauts CR/LF.</p>'; 97$errorBadCharacters = '<p class="avertissement" >Caractères interdits: espaces, tabulations, sauts CR/LF.</p>';
98$messageDeconnect = "<p class='connexionP connexionFooter' ><i>N'oubliez de cliquer sur 'déconnexion' quand vous aurez fini.</i></p>";
78 99
79// avertissement 100// avertissement
80$warning = '<p class="avertissement" >Rappel de sécurité<br />Vous n\'utilisez pas votre propre ordinateur ou téléphone? Utilisez la navigation privée!</p>'; 101$warning = '<p class="avertissement" >Rappel de sécurité<br />Vous n\'utilisez pas votre propre ordinateur ou téléphone? Utilisez la navigation privée!</p>';
@@ -95,8 +116,10 @@ $message = ob_get_clean();
95// pied de page 116// pied de page
96ob_start(); 117ob_start();
97?> 118?>
98 <p class="connexionFooter" > 119 <p class="connexionP connexionFooter" >
99 <i>N'oubliez de cliquer sur "déconnexion" quand vous aurez fini.</i> 120 <a href="index.php?from=<?= $_GET['from'] ?>" >
121 <button>Retour au site.</button>
122 </a>
100 </p> 123 </p>
101 </div> 124 </div>
102 </body> 125 </body>
diff --git a/à faire après livraison.txt b/à faire après livraison.txt
index de2c5b5..fb6dcbb 100644
--- a/à faire après livraison.txt
+++ b/à faire après livraison.txt
@@ -1,4 +1,4 @@
1captcha dans password.php 1variable de session avec vérification du captcha
2 2
3changer la police des titres pour une qui supporte les lettres accentuées 3changer la police des titres pour une qui supporte les lettres accentuées
4 4