summaryrefslogtreecommitdiff
path: root/index.php
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2021-04-20 21:46:33 +0200
committerpolo <ordipolo@gmx.fr>2021-04-20 21:46:33 +0200
commit87798e5554eb0330cd2de255e5034f0472d410a4 (patch)
treeacd9e26a7d912c7575cb6dd1c7b42cc3e9f52993 /index.php
downloadmelaine-87798e5554eb0330cd2de255e5034f0472d410a4.zip
mot de passe
Diffstat (limited to 'index.php')
-rw-r--r--index.php201
1 files changed, 201 insertions, 0 deletions
diff --git a/index.php b/index.php
new file mode 100644
index 0000000..72791fd
--- /dev/null
+++ b/index.php
@@ -0,0 +1,201 @@
1<?php
2// index.php
3//
4// routeur MVC ou controlleur principal
5// il récupère les GET, inclut les contrôleurs et appelle des fonctions
6// ce site utilise une architecture Modèle-Vue-Contrôleur (MVC)
7// le schéma ci-dessous représente le sens dans lequel le code est interprété
8//
9// modèle
10// ^ |
11// | v
12// routeur --> contrôleur
13// |
14// v
15// vue ---> envoi de la page au client
16//
17// pour retrouver quelque chose dans le code, il suffit de suivre un chemin linéaire dont le départ est ici
18// pas de croisement, pas de marche arrière, impossible de se perdre!
19//
20// à la racine de l'arbre des fichiers nous avons:
21// - 1 fichier index.php sur lequel se greffe tout le reste
22// - 4 dossiers pricipaux: controller - model - view - public
23// un avantage est que les chemins sont tous relatifs, partent tous de la racine du site et sont toujours bons
24
25// Les dossiers:
26// -> contrôleurs: traitements en PHP pur
27// -> modèles: interface entre PHP et données, on y trouve le SQL ou la manipulation de fichiers textes, le PHP y est générlement orienté objet
28// -> vues: le PHP y produit le HTML, il construit les pages,
29// le mélange PHP/HTML étant très vite assez dégueulasse, le HTML figé à placé à part dans le fichier view/template.php
30// -> le dossier public contient CSS, JS, images, polices, medias, etc, il est utilisé par le template
31// -> le dossier lib contient les bibliothèques, il contient notamment le ckeditor qui occupe une place centrale dans le projet, on y trouve aussi la bibli htmLawed qui protège des données dangereuses (failles XSS)
32// -> le dossier data qui est techniquement séparé du site
33//
34// pour le reste nous avons:
35// - le fichier imageAJAX.php traitant les requêtes AJAX
36// ce fichier est appelé sans index.php et est pour cette raison un peu spécial
37// - 1 fichier .htaccess pour la sécurité (configurer le httpd.conf peut être nécessaire)
38// - 1 fichier erreur404.php (fonctionne avec .htaccess)
39// - des bibliothèques externes dans lib:
40// ckeditor5, ckfinder, htmlawed et HtmlFormatter
41//
42// le dossier data et son contenu sont "normalement" autorisés en écriture pour deux raisons:
43// - placer le contenu pré-existant avec son client FTP
44// - autoriser PHP (sinon, c'est comme si on avait un site statique)
45//
46// 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
47
48// au premier démarrage du site
49require('controller/installation.php');
50installation();
51
52// à propos des sessions, penser aux attaques CSRF (cross-site request forgery):
53// ç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
54// - solutionq: 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 nécessite d'injecter du javascript
55// - on peut demander à l'utilisateur une vérification supplémentaire avant chaque action, mais c'est plutôt chiant
56// - la méthode des jetons, "nonces" et horodatage
57// - vérifier le "référent", c'est à dire l'URL de la page d'où vient normallement la requête
58// infos: https://fr.wikipedia.org/wiki/Cross-site_request_forgery
59session_start();
60
61// sécurité failles XSS
62require('lib/htmlawed/htmLawed.php');
63
64// traitement des POST du ckeditor
65// NOTER que le fichier "habituel" controller/admin.php n'est pas utilisé
66// la fonction submitCKeditor n'affiche rien puis redirige sans GET
67if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1
68 && isset($_GET['action']) && $_GET['action'] == 'submit'
69 && isset($_POST['contenu']))
70{
71 require('controller/ckeditor.php');
72 submitCKeditor($_GET['page'], $_GET['article'], $_POST['contenu']);
73
74 // nettoyage (je ne sais pas si ça sert à quelque chose, mais c'est pas grave)
75 unlink($_GET['action']);
76 unlink($_POST['contenu']);
77
78 // rechargement "nettoyage" à la fin du traitement
79 header('Location: index.php?page=' . $_GET['page']);
80}
81
82// déconnexion: nettoyer et recharger la page
83if(isset($_GET['action']))
84{
85 if($_GET['action'] == "deconnexion")
86 {
87 $_SESSION['admin'] = 0;
88 header('Location: index.php');
89 }
90}
91
92// le site comporte deux modes:
93// le mode normal en "lecture seule" utilisant le contrôleur visitor.php
94// le mode admin avec droits en "écriture" utilisant le contrôleur admin.php
95
96// appelé tout le temps parce que certaines pages (accueil, menu) n'ont pas de version "admin"
97// une optimisation serait bienvenue
98require('controller/visitor.php');
99
100if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1)
101{
102 require('controller/admin.php');
103}
104else
105{
106 // initialisation
107 $_SESSION['admin'] = 0;
108}
109
110// mot de passe de connexion à protéger par le .htaccess !!
111$secret = "julian";
112
113// page du site demandée
114if(isset($_GET['page']))
115{
116 // page menu
117 if($_GET['page'] == 'menu')
118 {
119 menu();
120 }
121
122 // page melaine
123 elseif($_GET['page'] == 'melaine')
124 {
125 // ouverture de l'éditeur
126 if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor')
127 {
128 // modification
129 if(isset($_GET['article']) && is_numeric($_GET['article']) && $_GET['article'] > 0)
130 {
131 melaineAdmin($_GET['article']);
132 }
133 // nouvel article
134 else
135 {
136 melaineAdmin(0);
137 }
138 }
139 else
140 {
141 melaineVisitor();
142 }
143 }
144 // page connexion au mode admin
145 elseif($_GET['page'] == 'connexion')
146 {
147 connexion($secret);
148 }
149 // $_GET['page'] = n'importe quoi!
150 else
151 {
152 menu();
153 }
154}
155
156// actions en mode admin recharger une des pages principales
157elseif($_SESSION['admin'] == 1 && isset($_GET['action']))
158{
159 if($_GET['action'] == 'nouveau_mdp')
160 {
161 changerMotDePasse($secret, $_GET['from']);
162 }
163 // extraction du contenu du dossier data
164 else if($_GET['action'] == 'extraction')
165 {
166 require('controller/backup.php');
167 extraction($_GET['from']);
168 }
169 // l'inverse, insertion des données d'une sauvegarde
170 else if($_GET['action'] == 'insertion')
171 {
172 require('controller/backup.php');
173 insertion($_GET['from']);
174 }
175 else
176 {
177 accueil();
178 }
179}
180
181// renvoi ici par le .htaccess si lien mort ou sans http:// au début
182elseif(isset($_GET['erreur']))
183{
184 //if($_GET['erreur'] == 404)
185 //{
186 // echo('<p style="color: red;" >ERREUR 404<br/>Le lien sur lequel vous avez cliqué pointe vers un emplacement introuvable.<br />
187 // 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.</p>');
188 // echo('<p><a href="index.php" >Retour au site</a></p>');
189 //}
190 //else
191 //{
192 accueil();
193 // accueil_404(); // à créer
194 //}
195}
196
197// page d'accueil (adresse sans GET valable)
198else
199{
200 accueil();
201}