diff options
author | polo <ordipolo@gmx.fr> | 2021-04-20 21:46:33 +0200 |
---|---|---|
committer | polo <ordipolo@gmx.fr> | 2021-04-20 21:46:33 +0200 |
commit | 87798e5554eb0330cd2de255e5034f0472d410a4 (patch) | |
tree | acd9e26a7d912c7575cb6dd1c7b42cc3e9f52993 /index.php | |
download | melaine-87798e5554eb0330cd2de255e5034f0472d410a4.zip |
mot de passe
Diffstat (limited to 'index.php')
-rw-r--r-- | index.php | 201 |
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 | ||
49 | require('controller/installation.php'); | ||
50 | installation(); | ||
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 | ||
59 | session_start(); | ||
60 | |||
61 | // sécurité failles XSS | ||
62 | require('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 | ||
67 | if(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 | ||
83 | if(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 | ||
98 | require('controller/visitor.php'); | ||
99 | |||
100 | if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1) | ||
101 | { | ||
102 | require('controller/admin.php'); | ||
103 | } | ||
104 | else | ||
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 | ||
114 | if(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 | ||
157 | elseif($_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 | ||
182 | elseif(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) | ||
198 | else | ||
199 | { | ||
200 | accueil(); | ||
201 | } | ||