From 452420d0cd05822a9974fe27f0edc4cc4dc300cc Mon Sep 17 00:00:00 2001 From: polo Date: Wed, 18 Aug 2021 10:45:26 +0200 Subject: password --- controller/admin.php | 52 ------------- controller/installation.php | 14 +++- controller/password.php | 178 ++++++++++++++++++++++++++++++++++++++++++-- controller/visitor.php | 51 +------------ index.php | 38 +++++----- model/Classes.php | 19 ++--- public/accueil.css | 46 ++++++++---- public/main.js | 11 ++- view/connexion.php | 87 ---------------------- view/password.php | 107 ++++++++++++++++++++++++++ view/template.php | 4 +- 11 files changed, 357 insertions(+), 250 deletions(-) delete mode 100644 view/connexion.php create mode 100644 view/password.php diff --git a/controller/admin.php b/controller/admin.php index 29ccd41..0abdb1c 100644 --- a/controller/admin.php +++ b/controller/admin.php @@ -90,55 +90,3 @@ function discoEdit($numArticle, $suppression) // fin de l'assemblage require('view/template.php'); } - -function changerMotDePasse($secret) -{ - // vérification supplémentaire - if($_SESSION['admin'] !== 1) - { - $_SESSION['admin'] = 0; - header('Location: index.php?page=' . $_GET['from']); - 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."; - - // cette page utilise la même vue que la fonction connexion() dans controller/visiteur.php - require('view/connexion.php'); - - echo($header); - - // traitements: vérification ancien mot de passe et choix du nouveau - // bon mot de passe - if(isset ($_POST["ancienMotdepasse"]) AND $_POST["ancienMotdepasse"] == $secret) - { - // confirmation - echo($message); - //exit(); - - /*header('Location: index.php?page=' . $_GET['from'] . '&message=nouveau_mdp'); - exit();*/ - } - - // mauvais mot de passe - elseif(isset ($_POST["ancienMotdepasse"]) AND $_POST["ancienMotdepasse"] != $secret) - { - // défense aux attaques par force brute - // pas parfait, ne marche pas si l'attaquant multiplie les connexions au site - echo($erreurMDP); - sleep(1); - echo($formulaireNouveauMDP); - } - - // première arrivée sur la page - else - { - echo($formulaireNouveauMDP); - } - - echo($footer); -} diff --git a/controller/installation.php b/controller/installation.php index e7136a5..42212f5 100644 --- a/controller/installation.php +++ b/controller/installation.php @@ -49,7 +49,7 @@ function installation() // - modifier ceux du dossier parent (nom du site) avec son client FTP à la mise en ligne chez l'hébergeur et ensuite remettre tout comme avant // le 0 devant signifie que le nombre est en octal - // on pourra changer cette valeur à la mise en production du site si le script d'upload des données est bon + // changer cette valeur à la mise en production du site si le script d'upload des données est bon $droitsDossiers = 0777; $listePages = array('melaine', 'discographie', 'concerts', 'presse', 'ateliers', 'liens', 'peinture', 'archives'); @@ -82,5 +82,15 @@ function installation() mkdir('data/discographie/json'); chmod('data/discographie/json', $droitsDossiers); } - // donner les droits 666 aux fichiers à l'intérieur + // fichier password.txt + if(!file_exists('data/password.txt')) + { + touch('data/password.txt'); + chmod('data/password.txt', 0600); + } + + // le modèle donnera les droits 0666 (octal) aux nouveaux fichiers à l'intérieur des dossiers + + // création d'un mot de passe si password.txt est vide + createPassword(); } diff --git a/controller/password.php b/controller/password.php index 987670f..4ca9f4f 100644 --- a/controller/password.php +++ b/controller/password.php @@ -1,16 +1,180 @@ setPage($page_actuelle); $Articles->getFiles(); $Articles->reverseFilesArray(); - $articles = $Articles->getAll(); + $articles = $Articles->getAll(); // lourd // vérification pour protéger les visiteurs // normalement déjà faite dans submit.php, au cas où la base a été trafiquée @@ -79,51 +79,4 @@ function peinture() {} function archives() -{} - -function connexion($secret) -{ - // déjà en mode admin - if($_SESSION['admin'] == 1) - { - header('Location: index.php?page=' . $_GET['from']); - 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 = "connexion"; - $subHeading = "Veuillez saisir votre mot de passe pour pouvoir apporter des modifications au site."; - - // cette page utilise la même vue que la fonction changerMotDePasse() dans controller/admin.php - require('view/connexion.php'); - - echo($header); - - // bon mot de passe - if(isset ($_POST["motdepasse"]) AND $_POST["motdepasse"] == $secret) - { - $_SESSION['admin'] = 1; - header('Location: index.php?page=' . $_GET['from']); - exit(); - } - - // mauvais mot de passe - elseif(isset ($_POST["motdepasse"]) AND $_POST["motdepasse"] != $secret) - { - // défense aux attaques par force brute - // pas parfait, ne marche pas si l'attaquant multiplie les connexions au site - echo($erreurMDP); - sleep(1); - echo($formulaireConnexion); - } - - // première arrivée sur la page - else - { - echo($formulaireConnexion); - } - - echo($footer); -} +{} \ No newline at end of file diff --git a/index.php b/index.php index 8f6128e..dc5f3ba 100644 --- a/index.php +++ b/index.php @@ -38,12 +38,7 @@ // - autoriser PHP (sinon, c'est comme si on avait un site statique) // -> pour pouvoir installer le site en n'ayant qu'à modifier les droits du dossier data uniquement et éviter les situations pénibles ou l'utilisateur est bloqué sans rien comprendre, on pourra créer ou utiliser des sauvegardes au format ZIP depuis une page spéciale accessible avec le compte admin -// au premier démarrage du site -// l'explication des éventuels problèmes de droits en lecture/écriture est à chercher ici: -require('controller/installation.php'); -installation(); - -// à propos des sessions, penser aux attaques CSRF (cross-site request forgery): +// sessions, penser aux attaques CSRF (cross-site request forgery): // ça consite à faire qu'un utilisateur connecté avec une session envoie malgré lui une requête GET ou POST qu'un hacker aura cachée par exemple dans une fausse image clicable // - solution: faire qu'un GET seul dans une session ne suffise pas à effectuer une action (les GET ne doivent servir qu'à afficher la bonne page), une attaque sur un POST est possible aussi mais plus difficile et nécessite d'injecter du javascript // - on peut demander à l'utilisateur une vérification supplémentaire avant chaque action, mais c'est plutôt chiant @@ -52,6 +47,14 @@ installation(); // infos: https://fr.wikipedia.org/wiki/Cross-site_request_forgery session_start(); +// au premier démarrage du site +// l'explication des éventuels problèmes de droits en lecture/écriture est à chercher ici: +require('controller/installation.php'); +require('controller/password.php'); +installation(); + + + // traitement des POST du ckeditor // la fonction submitCKeditor n'affiche rien (controller/admin.php n'est pas utilisé) puis redirige sans GET if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 @@ -116,21 +119,20 @@ else } -// mot de passe de connexion à hacher! -// utiliser php pour ça, plus le .htaccess -require('controller/password.php'); -$secret = "julian"; - // page du site demandée if(isset($_GET['page'])) { + // page d'accueil + if($_GET['page'] == 'accueil') + { + accueil(); + } // page menu - if($_GET['page'] == 'menu') + elseif($_GET['page'] == 'menu') { menu(); } - // page melaine elseif($_GET['page'] == 'melaine') { @@ -200,10 +202,10 @@ if(isset($_GET['page'])) discoVisitor(); } } - // page connexion au mode admin + // page connexion elseif($_GET['page'] == 'connexion') { - connexion($secret); + connect(); } // $_GET['page'] = n'importe quoi! else @@ -216,9 +218,10 @@ if(isset($_GET['page'])) // actions en mode admin, recharger une des pages principales elseif($_SESSION['admin'] == 1 && isset($_GET['action'])) { - if($_GET['action'] == 'nouveau_mdp') + if($_GET['action'] == 'modif_mdp') { - changerMotDePasse($secret); + //changePassword($secret); + changePassword(); } // extraction du contenu du dossier data else if($_GET['action'] == 'extraction') @@ -250,7 +253,6 @@ elseif(isset($_GET['erreur'])) //else //{ accueil(); - // accueil_404(); // à créer //} } diff --git a/model/Classes.php b/model/Classes.php index 1b2a463..e574eeb 100644 --- a/model/Classes.php +++ b/model/Classes.php @@ -1,5 +1,5 @@ page = $page; } - //public function setAscending($croissant) - //{ - // $this->Ascending = $croissant; - //} - public function findFileName($numArticle) { $this->fileName = $this->files[$numArticle - 1]; @@ -53,12 +48,10 @@ class ArticlesManager { if($this->page == '') { - die("debug: la méthode setPage() doit être appelée avant toute autre."); + die("debug: la méthode setPage() doit être appelée avant getFiles()."); } $this->files = glob('data/' . $this->page . '/html/*.html'); - - //$this->nbArticles = count($this->files); } // ordre du tableau des noms de fichiers @@ -160,8 +153,8 @@ class AlbumsManager extends ArticlesManager // create //public function create($titre, $annee, $pochette) - //public function create($content) - public function create($content, $titre, $annee, $pochette) + public function create($content) + //public function create($content, $titre, $annee, $pochette) {} // read @@ -170,8 +163,8 @@ class AlbumsManager extends ArticlesManager // update //public function update($titre, $annee, $pochette) - //public function update($content) - public function update($content, $titre, $annee, $pochette) + public function update($content) + //public function update($content, $titre, $annee, $pochette) {} // delete diff --git a/public/accueil.css b/public/accueil.css index 2e4426a..7f33393 100644 --- a/public/accueil.css +++ b/public/accueil.css @@ -112,7 +112,7 @@ form .zoneVideAdmin { - padding-top: 30px; + padding-top: 20px; } #modeAdmin @@ -122,17 +122,22 @@ form bottom: 0px; width: 700px; z-index: 2; - padding-top: 10px; + padding-top: 5px; text-align: center; } #modeAdmin p { text-align: center; - margin-top: 0px; + margin: 0px; padding: 2px; } - +#modeAdmin>div p +{ + /*border: 1px black solid;*/ + margin: 5px; + padding: 0px; +} #modeAdmin>p a { padding: 2px; @@ -142,8 +147,8 @@ form { display: flex; justify-content: space-around; - border: 1px black solid; - margin: 10px; + + margin: 0px; font-size: 85%; } @@ -258,7 +263,7 @@ form .zoneVideAdmin, #modeAdmin { - height: 100px; + height: 70px; } } @@ -333,7 +338,7 @@ form .zoneVideAdmin, #modeAdmin { - height: 90px; + height: 75px; } #modeAdmin @@ -351,6 +356,14 @@ form margin: 0px; border: none; } + #modeAdmin + { + font-size: 90%; + } + .zoneVideAdmin, #modeAdmin + { + height: 70px; + } } @media screen and (max-width: 479px) @@ -427,7 +440,7 @@ form .zoneVideAdmin, #modeAdmin { - height: 80px; + height: 65px; } #modeAdmin @@ -437,7 +450,7 @@ form #modeAdmin div { - margin: 5px; + /*margin: 5px;*/ } } @@ -446,21 +459,26 @@ form { .zoneVideAdmin, #modeAdmin { - height: 100px; + height: 80px; } #modeAdmin { font-size: 95%; + padding: 0px; } - - #modeAdmin>p a + #modeAdmin>p { - display: block; + font-size: 90%; + margin: 3px; } #modeAdmin div { max-width: 320px; } + #modeAdmin>div p + { + margin: 0px 5px; + } } diff --git a/public/main.js b/public/main.js index ec2b2f1..c392590 100644 --- a/public/main.js +++ b/public/main.js @@ -3,25 +3,24 @@ function versMenu() { // ergonomique - //window.setTimeout("location=('index.php?page=menu');", 10000); + window.setTimeout("location=('index.php?page=menu');", 10000); window.setTimeout(function(){location.href="index.php?page=menu"}, 3000); } function deconnexionAutomatique() { // minuterie réinitialisée après une action de l'utilisateur - // et sauvegarde avec le plugin "autosave" de l'éditeur - // 600000 ms = 10 min //window.setTimeout("location=('index.php?action=deconnexion');", 600000); + + // sauvegarde de la rédaction en cours avec le plugin "autosave" de l'éditeur } // fonction appelée avec onClick dans un lien, -// si on sélectionne pas "oui", on ne doit pas suivre le lien -// si javascript est désactivé, le lien fonctionne +// si JS est activé, on ne suit le lien qu'avec un "oui" +// si JS est désactivé, le lien fonctionne function confirmerSuppression() { - // ne suivre le lien "href" que si on clique sur oui var oui = confirm('Confirmer la suppression de cet article.'); if(!oui) { diff --git a/view/connexion.php b/view/connexion.php deleted file mode 100644 index 1c3aceb..0000000 --- a/view/connexion.php +++ /dev/null @@ -1,87 +0,0 @@ - -
- - - -
- -
- -

- - -

- -
- - - - - - - <?= $title ?> - - - - - - - - - - -
-

-

-Mauvais mot de passe

'; - -// confirmation modification mot de passe -ob_start(); -?> - - - -

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

-

- N'oubliez de cliquer sur "déconnexion" quand vous aurez fini.
- Retour à la page précédente -

-
- - - +
+ + + +
+ +
+ + + +
+ +
+ +

+ + +

+ +
+ + + + + + + <?= $title ?> + + + + + + + + + + +
+

+

+Mauvais mot de passe

'; + + +// confirmation modification du mot de passe +ob_start(); +?> + + + +

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

+ +

+ N'oubliez de cliquer sur "déconnexion" quand vous aurez fini.
+ Retour à la page précédente +

+
+ + +

Vous êtes en mode administrateur. - Options + Déconnexion

-

+

Changer le mot de passe de connexion.

Sauvegarder les données de tout le site.

-- cgit v1.2.3