From 8681ecc6f83507861899a8bcae21850dfc5e61d2 Mon Sep 17 00:00:00 2001 From: polo Date: Tue, 26 Jul 2022 01:47:53 +0200 Subject: captcha --- controller/Security.php | 3 +- controller/installation.php | 2 +- controller/password.php | 148 +++++++++++++++++++++------- controller/visitor.php | 1 + model/Article.php | 1 + public/css/accueil.css | 5 + view/password.php | 43 ++++++-- "\303\240 faire apr\303\250s 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) // regex pour détecter les balises et ajouter http:// au début des liens si nécessaire $pattern = '#()#'; $remplacement = '$1http://$2$3'; - // le "while" est ici parce que preg_replace s'arrête après avec trouvé et modifié un pattern, pourquoi?? + // le "while" est ici parce que preg_replace s'arrête après avec matché une fois + // plus exactement, le .* à la fin fait que la chaine détectée va jusqu'à la fin des données (à corriger peut-être avec ) while(preg_match($pattern, $data)) { $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() } // création d'un mot de passe si password.txt est vide - createPassword(); + existPassword(); } 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 @@ 'deux', + 3 => 'trois', + 4 => 'quatre', + 5 => 'cinq', + 6 => 'six', + 7 => 'sept', + 8 => 'huit', + 9 => 'neuf', + 10 => 'dix', + }; +} - // au rechargement après saisi +// vérifier qu'on a que des chiffres +function controlCaptchaInput() +{ + //$_POST['captcha'] +} + + +function createPassword() +{ + // paranoïa? + if(isset($_SESSION['admin'])) + { + unset($_SESSION['admin']); + header("Location: index.php"); + exit(); + } + + $captcha = createCaptcha(); + require('view/password.php'); + + $title = 'Bienvenue Melaine Favennec'; + $subHeading = 'Veuillez choisir le mot de passe que vous utiliserez pour gérer le site.'; + + // au rechargement après saisi + if(isset($_POST['motdepasse']) && !empty($_POST['motdepasse']) && isset($_POST['captcha']) && (int) $_POST['captcha'] == $_SESSION['captcha']) + { + // caractères non désirés supprimés // impossible d'entrer un espace ou une tabulation et de valider par erreur - if(isset($_POST['motdepasse']) && !empty($_POST['motdepasse'])) - { - // caractères non désirés supprimés - require('controller/Security.php'); - $password = Security::secureString($_POST['motdepasse']); - $password = removeSpacesTabsCRLF($_POST['motdepasse']); - } + require('controller/Security.php'); + $password = Security::secureString($_POST['motdepasse']); + $password = removeSpacesTabsCRLF($_POST['motdepasse']); + // enregistrement if(isset($password) && $password == $_POST['motdepasse']) { hashNewPassword($_POST['motdepasse']); + unset($_SESSION['captcha']); // nettoyage header('Location: index.php'); } - // 1ère fois + // mot de passe non valable else { - $title = 'Créer un mot de passe'; - $subHeading = 'Veuillez choisir le mot de passe que vous utiliserez pour gérer le site.'; - - require('view/password.php'); - + sleep(1); echo($header); - echo($errorBadCharacters); + echo($errorPassword); echo($formulaireNouveauMDP); - echo($warning); + echo($errorBadCharacters); } - exit(); } + // mauvais captcha + elseif(isset($_POST['captcha']) && (int) $_POST['captcha'] != $_SESSION['captcha']) + { + sleep(1); + echo($header); + echo($errorCaptcha); + echo($formulaireNouveauMDP); + echo($errorBadCharacters); + } + // 1ère fois + else + { + echo($header); + echo($formulaireNouveauMDP); + echo($errorBadCharacters); + //echo($warning); // message pas top + } + + // fois suivante (dispense de nettoyer la variable) + $_SESSION['captcha'] = $captcha[2]; + exit(); } + function connect() { // déjà en mode admin @@ -72,6 +132,7 @@ function connect() } // Ajouter une sécurité par cpatcha avec un "input" supplémentaire + $captcha = createCaptcha(); // Et créer une variable de session pour la réponse au CAPTCHA $title = "Connexion"; @@ -82,20 +143,29 @@ function connect() echo($header); - // bon mot de passe - if(isset ($_POST["motdepasse"]) AND testPassword($_POST["motdepasse"])) + // bon codes (mot de passe et captcha) + if(isset ($_POST["motdepasse"]) && testPassword($_POST["motdepasse"]) && isset($_POST['captcha']) && (int) $_POST['captcha'] == $_SESSION['captcha']) { $_SESSION['admin'] = 1; + unset($_SESSION['captcha']); // nettoyage header('Location: index.php?page=' . $_GET['from']); exit(); } - // mauvais mot de passe - elseif(isset ($_POST["motdepasse"]) AND !testPassword($_POST["motdepasse"])) + // mauvais captcha + elseif(isset($_POST['captcha']) && (int) $_POST['captcha'] != $_SESSION['captcha']) + { + echo($errorCaptcha); + sleep(1); + echo($formulaireConnexion); + } + + // mauvais codes + elseif(isset ($_POST["motdepasse"]) && !testPassword($_POST["motdepasse"])) { // défense aux attaques par force brute // pas parfait, ne marche pas si l'attaquant multiplie les connexions au site - echo($erreurMDP); + echo($errorPassword); sleep(1); echo($formulaireConnexion); } @@ -106,6 +176,10 @@ function connect() echo($formulaireConnexion); } + // fois suivante (dispense de nettoyer la variable) + $_SESSION['captcha'] = $captcha[2]; + + echo($messageDeconnect); echo($footer); } @@ -119,8 +193,6 @@ function changePassword() exit(); } - // Ajouter une sécurité par cpatcha avec un "input" supplémentaire - // Et créer une variable de session pour la réponse au CAPTCHA $title = "Nouveau mot de passe"; $subHeading = "Veuillez saisir votre actuel mot de passe suivi du nouveau."; @@ -137,14 +209,14 @@ function changePassword() // bon mot de passe if(isset($newPassword) && $newPassword === $_POST['nouveauMotdepasse'] - && isset ($_POST["ancienMotdepasse"]) AND testPassword($_POST["ancienMotdepasse"])) + && isset ($_POST["ancienMotdepasse"]) && testPassword($_POST["ancienMotdepasse"])) { // enregistrement et confirmation hashNewPassword($_POST["nouveauMotdepasse"]); echo($message); } // mauvais mot de passe - elseif(isset ($_POST["ancienMotdepasse"]) AND !testPassword($_POST["ancienMotdepasse"])) + elseif(isset ($_POST["ancienMotdepasse"]) && !testPassword($_POST["ancienMotdepasse"])) { // défense aux attaques par force brute // pas parfait, ne marche pas si l'attaquant multiplie les connexions au site @@ -164,7 +236,7 @@ function changePassword() echo($formulaireModifMDP); } - echo($warning); + //echo($warning); echo($footer); } 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 // données dans $Articles->fileList['content'] $Articles->readAll(); $Articles->fileList = array_reverse($Articles->fileList); + //var_dump($Articles->fileList[0]); } // 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 // read public function readAll() // ajoute le contenu à FileList { + // lit du html ou du json si appelée depuis la classe Album for($i = 0; $i < $this->fileListCount; $i++) { $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 margin-top: 0px; text-align: center; } +.connexionP +{ + margin: 20px; + text-align: center; +} .avertissement { 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 @@ // ce fichier contient le HTML de deux pages du site: // - connexion au mode admin // - changement de mot de passe +// +// rajouter la page "créatio du mot de passe"? -// formulaire création du mot de passe +// insertion du captcha ob_start(); ?> -
+

Montrez que vous n'êtes pas un robot.
+ + +

+ + + + +
-
+ + + +
Ancien mot de passe:

- +

@@ -67,14 +86,16 @@ ob_start();

-

+

Mauvais mot de passe

'; +$errorCaptcha = '

Erreur au test anti-robot

'; $errorBadCharacters = '

Caractères interdits: espaces, tabulations, sauts CR/LF.

'; +$messageDeconnect = "

N'oubliez de cliquer sur 'déconnexion' quand vous aurez fini.

"; // avertissement $warning = '

Rappel de sécurité
Vous n\'utilisez pas votre propre ordinateur ou téléphone? Utilisez la navigation privée!

'; @@ -95,8 +116,10 @@ $message = ob_get_clean(); // pied de page ob_start(); ?> -

- N'oubliez de cliquer sur "déconnexion" quand vous aurez fini. +

+ + +

diff --git "a/\303\240 faire apr\303\250s livraison.txt" "b/\303\240 faire apr\303\250s livraison.txt" index de2c5b5..fb6dcbb 100644 --- "a/\303\240 faire apr\303\250s livraison.txt" +++ "b/\303\240 faire apr\303\250s livraison.txt" @@ -1,4 +1,4 @@ -captcha dans password.php +variable de session avec vérification du captcha changer la police des titres pour une qui supporte les lettres accentuées -- cgit v1.2.3