diff options
author | polo <ordipolo@gmx.fr> | 2022-07-26 01:47:53 +0200 |
---|---|---|
committer | polo <ordipolo@gmx.fr> | 2022-07-26 01:47:53 +0200 |
commit | 8681ecc6f83507861899a8bcae21850dfc5e61d2 (patch) | |
tree | 4414dafb2be493125b57437af07041ca2814b7b1 | |
parent | 251a6926a1a09e4cc9da1b4f91be7c3a8283bf3f (diff) | |
download | melaine-8681ecc6f83507861899a8bcae21850dfc5e61d2.zip |
captcha
-rw-r--r-- | controller/Security.php | 3 | ||||
-rw-r--r-- | controller/installation.php | 2 | ||||
-rw-r--r-- | controller/password.php | 148 | ||||
-rw-r--r-- | controller/visitor.php | 1 | ||||
-rw-r--r-- | model/Article.php | 1 | ||||
-rw-r--r-- | public/css/accueil.css | 5 | ||||
-rw-r--r-- | view/password.php | 43 | ||||
-rw-r--r-- | à faire après livraison.txt | 2 |
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 | ||
123 | function createIndexPHP($path, $droitsFichiers) | 123 | function 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 |
5 | function createPassword() | 5 | function 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(); | 29 | function 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 | |||
36 | function 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 |
53 | function controlCaptchaInput() | ||
54 | { | ||
55 | //$_POST['captcha'] | ||
56 | } | ||
57 | |||
58 | |||
59 | function 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 | |||
65 | function connect() | 125 | function 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 |
9 | ob_start(); | 11 | ob_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 | ||
22 | ob_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 |
20 | ob_start(); | 36 | ob_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 |
96 | ob_start(); | 117 | ob_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 @@ | |||
1 | captcha dans password.php | 1 | variable de session avec vérification du captcha |
2 | 2 | ||
3 | changer la police des titres pour une qui supporte les lettres accentuées | 3 | changer la police des titres pour une qui supporte les lettres accentuées |
4 | 4 | ||