From 787d03e48471ba62cd830379428f04d996f0b74b Mon Sep 17 00:00:00 2001 From: polo Date: Thu, 17 Feb 2022 18:13:00 +0100 Subject: model update --- index.php | 570 ++++++++++++++++++++++++++++++-------------------------------- 1 file changed, 271 insertions(+), 299 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index a34a4be..70ca884 100644 --- a/index.php +++ b/index.php @@ -1,299 +1,271 @@ - contrôleur -// | -// v -// vue ---> envoi de la page au client -// -// pour retrouver quelque chose dans le code, il suffit de suivre un chemin linéaire dont le départ est ici -// pas de croisement, pas de marche arrière, impossible de se perdre! -// autre avantage: les chemins sont tous relatifs et sont toujours bons, parce que tous les fichiers sont "inclus" dans index.php -// -// Les dossiers: -// -> controller: traitements en PHP pur -// -> model: interface entre PHP et données, on y trouve le SQL ou la manipulation de fichiers textes, le PHP y est orienté objet -// -> view: le PHP y produit le HTML, il construit les pages, -// le mélange PHP/HTML étant très vite assez dégueulasse, le HTML figé est placé à part dans le fichier view/template.php -// -> public: contient CSS, JS, images, polices, medias, etc, il est utilisé par template.php -// -> lib: les bibliothèques, on y trouve en particulier le ckeditor qui occupe une place centrale dans le projet, et aussi htmLawed qui nettoie le HTML produit par l'éditeur (failles XSS) -// -> data: comme son nom l'indique -// -// Quelques fichiers spéciaux (indépendants de index.php): -// - imageAJAX.php traite les requêtes AJAX envoyées par l'éditeur -// - .htaccess pour la sécurité (configurer le httpd.conf d'apache peut être nécessaire) -// - erreur404.php (fonctionne avec .htaccess) -// -// le dossier data et son contenu sont "normalement" autorisés en écriture pour deux raisons: -// - placer le contenu pré-existant avec son client FTP -// - 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 - -// 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 -// - il y a la méthode des jetons, "nonces" et horodatage -// - vérifier le "référent", c'est à dire l'URL de la page d'où vient normallement la requête -// infos: https://fr.wikipedia.org/wiki/Cross-site_request_forgery -session_start(); - -if(!empty($_SESSION['erreur'])) -{ - echo(''); - unset($_SESSION['erreur']); -} - -// 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 requêtes AJAX -if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_image') -{ - // et une backdoor de fermée! - if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1 - || !isset($_FILES['upload']) || empty($_FILES['upload'])) - { - // sans effet? - header('Location: index.php?erreur=image_ajax'); - } - else - { - require('model/Image.php'); - // paramètre "true" parce qu'on reçoit une requête AJAX - $Image = new Image(true); - $Image->upload(); - } - exit; // arrêt ici !! -} - - -// traitement des POST du ckeditor -// la fonction submitCKeditor est "autonome", elle n'affiche rien puis redirige sans GET -if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 - && isset($_GET['action']) && $_GET['action'] == 'submit' - // trois possibilités: on a un contenu HTML ou JSON ou les deux - && ((isset($_POST['contenu']) && $_POST['contenu'] != '') - || (isset($_POST['titre']) && isset($_POST['annee'])))) -{ - require('controller/ckeditor.php'); // traitement du POST - require('controller/Security.php'); // sécurité des chaines - require('model/Page.php'); // modèle - if($_GET['page'] == 'discographie') - { - require('model/Album.php'); - } - - // modification - if(isset($_SESSION['target'])) - { - submitCKeditor($_SESSION['target']); - } - // nouvel article - else - { - submitCKeditor(''); - } - - // nettoyage - unset($_SESSION['nomFichier']); - unset($_GET['action']); - unset($_POST['contenu']); - header('Location: index.php?page=' . $_GET['page']); - exit(); -} - -// déconnexion: nettoyer et recharger la page -if(isset($_GET['action']) && isset($_GET['page'])) -{ - if($_GET['action'] == "deconnexion") - { - $_SESSION['admin'] = 0; - header('Location: index.php?page=' . $_GET['page']); - } -} - -// contrôleur des pages en mode visiteur (= lecture uniquement) -// appelé tout le temps parce que certaines pages (accueil, menu) n'ont pas de version "admin" => à améliorer -require('controller/visitor.php'); - -// utile pour presque toutes les pages -if(isset($_GET['page']) && $_GET['page'] != 'menu') -{ - require('model/Page.php'); - if($_GET['page'] == 'discographie' || $_GET['page'] == 'album') - { - require('model/Album.php'); - } -} - -// contrôleur des pages en mode admin -if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1) -{ - // contrôleur en mode admin (= lecture/écriture) - require('controller/admin.php'); -} -else -{ - // initialisation - $_SESSION['admin'] = 0; -} - - -// page du site demandée -if(isset($_GET['page'])) -{ - // page d'accueil - if($_GET['page'] == 'accueil') - { - accueil(); - } - // page menu - elseif($_GET['page'] == 'menu') - { - menu(); - } - // page melaine - elseif($_GET['page'] == 'melaine') - { - // Si ouverture de l'éditeur pour modification: - // le lien utilisé pour ouvrir l'éditeur contient un GET avec le numéro de l'article, mais pas le nom du fichier que le visiteur ne doit pas voir - // GET, POST, cookies => navigation (utiles au visiteur) - // sessions => action - // c'est ici qu'on passe des GET aux sessions - // on associe maintenant le numéro de l'article et le nom du fichier, l'article déjà existant inséré dans l'éditeur DOIT être celui qui sera modifié - - if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor') - { - // modification - if(isset($_GET['article']) && is_numeric($_GET['article']) && $_GET['article'] > 0) - { - melaineEdit($_GET['article'], 0); - } - // nouvel article - else - { - // par sécurité - unset($_SESSION['nomFichier']); - - melaineEdit(0, 0); - } - } - // suppression - else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression') - { - melaineEdit($_GET['article'], 1); - } - else - { - melaineVisitor(); - } - } - // page discographie - elseif($_GET['page'] == 'discographie') - { - if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'edition') - { - // modification - if(isset($_GET['album_code']) || !empty($_GET['album_code'])) - { - discoEdit($_GET['album_code'], 0); - } - // nouvel article - else - { - // par sécurité - $_GET['album_code'] = ''; - unset($_SESSION['nomFichier']); - - discoEdit('', 0); - } - } - // suppression - else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression') - { - discoEdit($_GET['album_code'], 1); - } - else - { - discoVisitor(); - } - } - // page d'un album de la discographie - elseif($_GET['page'] == 'album') - { - album($_GET['album_code'], $_GET['album_name']); - // page visiteur uniquement - } - // page connexion - elseif($_GET['page'] == 'connexion') - { - connect(); - } - // $_GET['page'] = n'importe quoi! - else - { - menu(); - } -} - - -// actions en mode admin, recharger une des pages principales -elseif($_SESSION['admin'] == 1 && isset($_GET['action'])) -{ - if($_GET['action'] == 'modif_mdp') - { - //changePassword($secret); - changePassword(); - } - // extraction du contenu du dossier data - else if($_GET['action'] == 'extraction') - { - require('controller/backup.php'); - extraction($_GET['from']); - } - // l'inverse, insertion des données d'une sauvegarde - else if($_GET['action'] == 'insertion') - { - require('controller/backup.php'); - insertion($_GET['from']); - } - else - { - accueil(); - } -} - -// renvoi ici par le .htaccess si lien mort ou sans http:// au début -elseif(isset($_GET['erreur'])) -{ - //if($_GET['erreur'] == 404) - //{ - // echo('

ERREUR 404
Le lien sur lequel vous avez cliqué pointe vers un emplacement introuvable.
- // Ce n\'est pas votre faute. Vous pouvez éventuellement rechercher la page demandée avec votre moteur de recherche ou prévenir le responsable du site.

'); - // echo('

Retour au site

'); - //} - //else - //{ - accueil(); - //} -} - -// page d'accueil (adresse sans GET valable) -else -{ - accueil(); -} +alert(\'' . $_SESSION['erreur'] . '\');'); + unset($_SESSION['erreur']); +} + +// 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 requêtes AJAX +if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_image') +{ + // sécurité !! + if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1 + || !isset($_FILES['upload']) || empty($_FILES['upload'])) + { + // sans effet? + header('Location: index.php?erreur=image_ajax'); + } + else + { + require('model/Image.php'); + // paramètre "true" parce qu'on reçoit une requête AJAX + $Image = new Image(true); + $Image->upload(); + } + exit; // stop !! +} + + +// traitement des POST du ckeditor +// la fonction submitCKeditor est "autonome", elle n'affiche rien puis redirige sans GET +if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 + && isset($_GET['action']) && $_GET['action'] == 'submit' + // trois possibilités: on a un contenu HTML ou JSON ou les deux + && ((isset($_POST['contenu']) && $_POST['contenu'] != '') + || (isset($_POST['titre']) && isset($_POST['annee'])))) +{ + require('controller/ckeditor.php'); // traitement du POST + require('controller/Security.php'); // sécurité des chaines + require('model/Article.php'); + + if($_GET['page'] == 'discographie') + { + require('model/Album.php'); + } + + submitCKeditor(); + // modification + /*if(isset($_SESSION['target'])) + { + submitCKeditor($_SESSION['target']); + } + // nouvel article + else + { + submitCKeditor(''); // $target = '' + }*/ +} +else +{ + unset($_SESSION['target']); +} + + +// déconnexion +if(isset($_GET['action']) && isset($_GET['page'])) +{ + if($_GET['action'] == "deconnexion") + { + // on nettoie et on recharge + $_SESSION['admin'] = 0; + header('Location: index.php?page=' . $_GET['page']); + } +} + + + +// construction des pages + +// mode visiteur (sans l'éditeur) +require('controller/visitor.php'); + +// modèle +if(isset($_GET['page']) && $_GET['page'] != 'menu') +{ + require('model/Article.php'); + if($_GET['page'] == 'discographie' || $_GET['page'] == 'album') + { + require('model/Album.php'); + } +} + + +// contrôleur des pages en mode admin +if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1) +{ + // contrôleur en mode admin (= lecture/écriture) + require('controller/admin.php'); +} +else +{ + // initialisation + $_SESSION['admin'] = 0; +} + + +// page du site demandée +if(isset($_GET['page'])) +{ + // page d'accueil + if($_GET['page'] == 'accueil') + { + accueil(); + } + // page menu + elseif($_GET['page'] == 'menu') + { + menu(); + } + // page melaine + elseif($_GET['page'] == 'melaine') + { + // cas de l'ouverture de l'éditeur pour modification: + // on récupère le GET qui sera placé dans une session + // GET, POST, cookies => navigation (utiles au visiteur) + // sessions => action + // un seul utilisateur peut modifier les données donc ça va, + // avec plusieurs utilisateurs, il faut plus de sécurités + + // rédaction + if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor') + { + //echo($_GET['file_code']); die(); + + // modification + if(isset($_GET['file_code']) || !empty($_GET['file_code'])) + { + melaineEdit($_GET['file_code'], 0); + } + // nouvel article + else + { + melaineEdit('', 0); + } + } + // suppression + else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression') + { + melaineEdit($_GET['file_code'], 1); + } + else + { + melaineVisitor(); + } + } + // page discographie + elseif($_GET['page'] == 'discographie') + { + // rédaction + if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'edition') + { + // modification + if(isset($_GET['file_code']) || !empty($_GET['file_code'])) + { + discoEdit($_GET['file_code'], 0); + } + // nouvel article + else + { + // par sécurité + unset($_GET['file_code']); + + discoEdit('', 0); + } + } + // suppression + else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression') + { + discoEdit($_GET['file_code'], 1); + } + else + { + discoVisitor(); + } + } + // page d'un album de la discographie + // page visiteur uniquement + elseif($_GET['page'] == 'album') + { + album($_GET['file_code'], $_GET['album_name']); + } + // page connexion + elseif($_GET['page'] == 'connexion') + { + connect(); + } + // $_GET['page'] = n'importe quoi! + else + { + menu(); + } +} + + +// actions en mode admin, recharger une des pages principales +elseif($_SESSION['admin'] == 1 && isset($_GET['action'])) +{ + if($_GET['action'] == 'modif_mdp') + { + //changePassword($secret); + changePassword(); + } + // extraction du contenu du dossier data + else if($_GET['action'] == 'extraction') + { + require('controller/backup.php'); + extraction($_GET['from']); + } + // l'inverse, insertion des données d'une sauvegarde + else if($_GET['action'] == 'insertion') + { + require('controller/backup.php'); + insertion($_GET['from']); + } + else + { + accueil(); + } +} + +// renvoi ici par le .htaccess si lien mort ou sans http:// au début +elseif(isset($_GET['erreur'])) +{ + //if($_GET['erreur'] == 404) + //{ + // echo('

ERREUR 404
Le lien sur lequel vous avez cliqué pointe vers un emplacement introuvable.
+ // Ce n\'est pas votre faute. Vous pouvez éventuellement rechercher la page demandée avec votre moteur de recherche ou prévenir le responsable du site.

'); + // echo('

Retour au site

'); + //} + //else + //{ + accueil(); + //} +} + +// page d'accueil (adresse sans GET valable) +else +{ + accueil(); +} -- cgit v1.2.3