diff options
author | polo <ordipolo@gmx.fr> | 2022-03-10 03:12:58 +0100 |
---|---|---|
committer | polo <ordipolo@gmx.fr> | 2022-03-10 03:12:58 +0100 |
commit | f331b3ab14f2b404c2089607aba2e2d434cd510d (patch) | |
tree | 09ecb84aa9db383f661d9e9a064b0d3d13d40a8b /controller | |
parent | 608856e0853b7e1d9b9b43e69b2012227ccefb43 (diff) | |
download | melaine-f331b3ab14f2b404c2089607aba2e2d434cd510d.zip |
fichiers index.php
Diffstat (limited to 'controller')
-rw-r--r-- | controller/Security.php | 6 | ||||
-rw-r--r-- | controller/backup.php | 70 | ||||
-rw-r--r-- | controller/ckeditor.php | 40 | ||||
-rw-r--r-- | controller/installation.php | 38 |
4 files changed, 92 insertions, 62 deletions
diff --git a/controller/Security.php b/controller/Security.php index c53cdc6..15c44b2 100644 --- a/controller/Security.php +++ b/controller/Security.php | |||
@@ -1,9 +1,6 @@ | |||
1 | <?php | 1 | <?php |
2 | // controller/Security.php | 2 | // controller/Security.php |
3 | 3 | ||
4 | // sécurité faille XSS avec htmLawed | ||
5 | require('lib/htmlawed/htmLawed.php'); | ||
6 | |||
7 | class Security | 4 | class Security |
8 | { | 5 | { |
9 | private static $configHtmLawed = array( | 6 | private static $configHtmLawed = array( |
@@ -16,6 +13,9 @@ class Security | |||
16 | 13 | ||
17 | public static function secureString(string $chaine): string | 14 | public static function secureString(string $chaine): string |
18 | { | 15 | { |
16 | // sécurité faille XSS avec htmLawed | ||
17 | require('lib/htmlawed/htmLawed.php'); | ||
18 | |||
19 | $chaine = htmLawed($chaine, self::$configHtmLawed, self::$specHtmLawed); | 19 | $chaine = htmLawed($chaine, self::$configHtmLawed, self::$specHtmLawed); |
20 | $chaine = trim($chaine); // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine (pour l'entrée de l'éditeur) | 20 | $chaine = trim($chaine); // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine (pour l'entrée de l'éditeur) |
21 | return $chaine; | 21 | return $chaine; |
diff --git a/controller/backup.php b/controller/backup.php index 1477c55..2cfccaa 100644 --- a/controller/backup.php +++ b/controller/backup.php | |||
@@ -103,55 +103,63 @@ function restaurer($from) | |||
103 | { | 103 | { |
104 | $title = 'Restauration des données'; | 104 | $title = 'Restauration des données'; |
105 | $message = ''; | 105 | $message = ''; |
106 | global $archiveFormat; | ||
106 | 107 | ||
107 | // recharger la même page en écrivant les données | 108 | // recharger la même page en écrivant les données |
108 | if(isset($_FILES['archive']) && $_FILES['archive']['error'] == 0) | 109 | if(isset($_FILES['archive']) && $_FILES['archive']['error'] == 0) |
109 | { | 110 | { |
110 | // détecter le format (zip ou autre) | 111 | // détecter le format (zip ou autre) |
112 | if($archiveFormat == 'zip') | ||
113 | { | ||
114 | // une copie du zip est conservée dans data/ au cas où | ||
115 | move_uploaded_file($_FILES['archive']['tmp_name'], 'data/' . $_FILES['archive']['name']); | ||
116 | chmod('data/' . $_FILES['archive']['name'], 0666); | ||
111 | 117 | ||
112 | // une copie du zip est conservée dans data/ au cas où | 118 | $nomFichier = 'data/' . $_FILES['archive']['name']; |
113 | move_uploaded_file($_FILES['archive']['tmp_name'], 'data/' . $_FILES['archive']['name']); | ||
114 | chmod('data/' . $_FILES['archive']['name'], 0666); | ||
115 | |||
116 | $nomFichier = 'data/' . $_FILES['archive']['name']; | ||
117 | 119 | ||
118 | // extraction | 120 | // extraction |
119 | try | 121 | try |
120 | { | 122 | { |
121 | $Zip = new ZipArchive(); | 123 | $Zip = new ZipArchive(); |
122 | } | 124 | } |
123 | catch (Throwable $e) // l'extension zip n'est pas activée | 125 | catch (Throwable $e) // l'extension zip n'est pas activée |
124 | { | ||
125 | echo($e); | ||
126 | die(); | ||
127 | } | ||
128 | if($Zip->open($nomFichier, ZipArchive::RDONLY) === TRUE) | ||
129 | { | ||
130 | $j = 0; | ||
131 | for($i = 0; $i < $Zip->numFiles; $i++) | ||
132 | { | 126 | { |
133 | $nomEntree = $Zip->getNameIndex($i); | 127 | echo($e); |
134 | if($Zip->extractTo('.', $nomEntree) === TRUE) | 128 | die(); |
129 | } | ||
130 | if($Zip->open($nomFichier, ZipArchive::RDONLY) === TRUE) | ||
131 | { | ||
132 | $j = 0; | ||
133 | for($i = 0; $i < $Zip->numFiles; $i++) | ||
135 | { | 134 | { |
136 | $j++; | 135 | $nomEntree = $Zip->getNameIndex($i); |
136 | if($Zip->extractTo('.', $nomEntree) === TRUE) | ||
137 | { | ||
138 | $j++; | ||
139 | } | ||
140 | else | ||
141 | { | ||
142 | $message = '<p style="color: red;" >Erreur: extraction du zip impossible.</p>'; | ||
143 | } | ||
144 | chmod($nomEntree, 0666); | ||
137 | } | 145 | } |
138 | else | 146 | |
147 | if($j == $Zip->numFiles) | ||
139 | { | 148 | { |
140 | $message = '<p style="color: red;" >Erreur: extraction du zip impossible.</p>'; | 149 | $message = '<p style="color: red;" >Restauration réussie !!</p>'; |
141 | } | 150 | } |
142 | chmod($nomEntree, 0666); | 151 | $Zip->close(); |
143 | } | 152 | } |
144 | 153 | else | |
145 | if($j == $Zip->numFiles) | ||
146 | { | 154 | { |
147 | $message = '<p style="color: red;" >Restauration réussie !!</p>'; | 155 | // mauvais fichier |
156 | $message = '<p style="color: red;" >Erreur: Impossible d\'ouvrir l\'archive Zip."</p>'; | ||
148 | } | 157 | } |
149 | $Zip->close(); | ||
150 | } | 158 | } |
151 | else | 159 | else |
152 | { | 160 | { |
153 | // mauvais fichier | 161 | // pas de module zip |
154 | $message = '<p style="color: red;" >Erreur: Impossible d\'ouvrir l\'archive Zip."</p>'; | 162 | $message = '<p style="color: red" >Erreur: Veuillez activer l\'extension zip dans le php.ini pour pouvoir gérer les sauvegardes.</p>'; |
155 | } | 163 | } |
156 | } | 164 | } |
157 | elseif(isset($_FILES['archive']) && $_FILES['archive']['error'] != 0) | 165 | elseif(isset($_FILES['archive']) && $_FILES['archive']['error'] != 0) |
diff --git a/controller/ckeditor.php b/controller/ckeditor.php index 4b4297a..d6ea8ad 100644 --- a/controller/ckeditor.php +++ b/controller/ckeditor.php | |||
@@ -47,6 +47,9 @@ function submitCKeditor() | |||
47 | if(isset($_POST['contenu'])) // optionnel pour discographie | 47 | if(isset($_POST['contenu'])) // optionnel pour discographie |
48 | { | 48 | { |
49 | $contenu = Security::secureString($_POST['contenu']); | 49 | $contenu = Security::secureString($_POST['contenu']); |
50 | |||
51 | // liens sans http:// devant | ||
52 | $contenu = fixLinks($contenu); | ||
50 | 53 | ||
51 | // récupérer les liens multimedia | 54 | // récupérer les liens multimedia |
52 | //require("media.php"); | 55 | //require("media.php"); |
@@ -142,14 +145,29 @@ function submitCKeditor() | |||
142 | 145 | ||
143 | 146 | ||
144 | // lien sans http:// | 147 | // lien sans http:// |
145 | // un clic sur un lien dans l'éditeur affiche une infobulle montrant l'adresse cible du lien si celle-ci a déjà été précisée | 148 | // si une adresse est de type "domaine.fr" sans le http:// devant, le comportement des navigateurs est de rechercher un fichier comme si mon adresse commençait par file:// |
146 | // il est possible de cliquer sur ce lien, ce qui ouvre un onglet avec le site demandé | 149 | // tomber ainsi sur une page d'erreur est parfaitement déroutant |
147 | // toutefois si cette adresse est de type "domaine.fr" (sans http:// devant), le navigateur ne va pas rechercher un site mais un fichier comme si mon adresse était de type file:///fichier | 150 | // une erreur 404 est détectée et le visiteur redirigé, mais ça ne règle pas le problème |
148 | // tomber ainsi sur une page d'erreur est déroutant: | 151 | // 2ème problème, en train d'écrire un article, l'utilisateur clique sur ce lien qu'il vient de créer et qui apparaît dans l'infobulle, un nouvelle onglet apparaît |
149 | // "ai-je perdu le texte que j'étais en train de taper?"" | 152 | // solution: fermer ce nouvel onglet avec echo '<SCRIPT>javascript:window.close()</SCRIPT>'; |
150 | // solution 1 (mauvaise): activer la redirection en cas d'erreur 404 dans le .htaccess | 153 | // le .htaccess doit pour ça détecter que l'erreur 404 est particulière |
151 | // solution 2 (façon pop-up): fermer ce nouvel onglet avec echo '<SCRIPT>javascript:window.close()</SCRIPT>'; | 154 | |
152 | // pour faire passer par le .htaccess l'info comme quoi la page précédente comportait un éditeur ouvert... | 155 | function fixLinks($data) |
153 | 156 | { | |
154 | function cleanHTML($contenu) | 157 | // regex pour détecter les balises <a>, analyser les liens à l'interieur et les modifier si nécessaire |
155 | {} | 158 | $pattern = '#<a href=".*">.*</a>#'; |
159 | |||
160 | if(preg_match($pattern, $data)) | ||
161 | {} | ||
162 | |||
163 | //$remplacement = 'http://$0'; | ||
164 | //$data = preg_replace($pattern, $remplacement, $data); | ||
165 | |||
166 | // contrairement à ce qui dit la doc | ||
167 | // https://www.php.net/manual/fr/filter.filters.validate.php | ||
168 | // une adresse du type "domaine.fr" ne passe pas le filtre | ||
169 | // il renvoie false, ce qui nous arrange ici! | ||
170 | //var_dump(filter_var($link, FILTER_VALIDATE_URL)); | ||
171 | |||
172 | return($data); | ||
173 | } | ||
diff --git a/controller/installation.php b/controller/installation.php index e8b1af8..0bd56c2 100644 --- a/controller/installation.php +++ b/controller/installation.php | |||
@@ -68,10 +68,19 @@ function installation() | |||
68 | require('view/backup.php'); | 68 | require('view/backup.php'); |
69 | exit(); | 69 | exit(); |
70 | } | 70 | } |
71 | if(!file_exists('data/index.html')) | 71 | |
72 | function createIndexPHP($path, $droitsFichiers) | ||
73 | { | ||
74 | $content = "<?php\nheader('Location: ../index.php');\nexit();"; | ||
75 | $file = fopen($path, 'w'); | ||
76 | fputs($file, $content); | ||
77 | fclose($file); | ||
78 | chmod($path, $droitsFichiers); | ||
79 | } | ||
80 | |||
81 | if(!file_exists('data/index.php')) | ||
72 | { | 82 | { |
73 | touch('data/index.html'); | 83 | createIndexPHP('data/index.php', $droitsFichiers); |
74 | chmod('data/index.html', $droitsFichiers); | ||
75 | } | 84 | } |
76 | 85 | ||
77 | $listePages = array('melaine', 'discographie', 'concerts', 'presse', 'ateliers', 'liens', 'peinture', 'archives'); | 86 | $listePages = array('melaine', 'discographie', 'concerts', 'presse', 'ateliers', 'liens', 'peinture', 'archives'); |
@@ -82,30 +91,27 @@ function installation() | |||
82 | mkdir('data/' . $page); | 91 | mkdir('data/' . $page); |
83 | chmod('data/' . $page, $droitsDossiers); | 92 | chmod('data/' . $page, $droitsDossiers); |
84 | } | 93 | } |
85 | if(!file_exists('data/' . $page . 'index.html')) | 94 | if(!file_exists('data/' . $page . '/index.php')) |
86 | { | 95 | { |
87 | touch('data/' . $page . '/index.html'); | 96 | createIndexPHP('data/' . $page . '/index.php', $droitsFichiers); |
88 | chmod('data/' . $page . '/index.html', $droitsFichiers); | ||
89 | } | 97 | } |
90 | if(!file_exists('data/' . $page . '/html')) | 98 | if(!file_exists('data/' . $page . '/html')) |
91 | { | 99 | { |
92 | mkdir('data/' . $page . '/html'); | 100 | mkdir('data/' . $page . '/html'); |
93 | chmod('data/' . $page . '/html', $droitsDossiers); | 101 | chmod('data/' . $page . '/html', $droitsDossiers); |
94 | } | 102 | } |
95 | if(!file_exists('data/' . $page . '/html/index.html')) | 103 | if(!file_exists('data/' . $page . '/html/index.php')) |
96 | { | 104 | { |
97 | touch('data/' . $page . '/html/index.html'); | 105 | createIndexPHP('data/' . $page . '/html/index.php', $droitsFichiers); |
98 | chmod('data/' . $page . '/html/index.html', $droitsFichiers); | ||
99 | } | 106 | } |
100 | if(!file_exists('data/' . $page . '/images')) | 107 | if(!file_exists('data/' . $page . '/images')) |
101 | { | 108 | { |
102 | mkdir('data/' . $page . '/images'); | 109 | mkdir('data/' . $page . '/images'); |
103 | chmod('data/' . $page . '/images', $droitsDossiers); | 110 | chmod('data/' . $page . '/images', $droitsDossiers); |
104 | } | 111 | } |
105 | if(!file_exists('data/' . $page . '/images/index.html')) | 112 | if(!file_exists('data/' . $page . '/images/index.php')) |
106 | { | 113 | { |
107 | touch('data/' . $page . '/images/index.html'); | 114 | createIndexPHP('data/' . $page . '/images/index.php', $droitsFichiers); |
108 | chmod('data/' . $page . '/images/index.html', $droitsFichiers); | ||
109 | } | 115 | } |
110 | // if(!file_exists('data/' . $page . '/multimedia')) | 116 | // if(!file_exists('data/' . $page . '/multimedia')) |
111 | // { | 117 | // { |
@@ -119,10 +125,9 @@ function installation() | |||
119 | mkdir('data/discographie/json'); | 125 | mkdir('data/discographie/json'); |
120 | chmod('data/discographie/json', $droitsDossiers); | 126 | chmod('data/discographie/json', $droitsDossiers); |
121 | } | 127 | } |
122 | if(!file_exists('data/discographie/json/index.html')) | 128 | if(!file_exists('data/discographie/json/index.php')) |
123 | { | 129 | { |
124 | touch('data/discographie/json/index.html'); | 130 | createIndexPHP('data/discographie/json/index.php', $droitsFichiers); |
125 | chmod('data/discographie/json/index.html', $droitsFichiers); | ||
126 | } | 131 | } |
127 | if(!file_exists('data/discographie/images-mini')) | 132 | if(!file_exists('data/discographie/images-mini')) |
128 | { | 133 | { |
@@ -131,8 +136,7 @@ function installation() | |||
131 | } | 136 | } |
132 | if(!file_exists('data/discographie/images-mini/index.html')) | 137 | if(!file_exists('data/discographie/images-mini/index.html')) |
133 | { | 138 | { |
134 | touch('data/discographie/images-mini/index.html'); | 139 | createIndexPHP('data/discographie/images-mini/index.php', $droitsFichiers); |
135 | chmod('data/discographie/images-mini/index.html', $droitsFichiers); | ||
136 | } | 140 | } |
137 | // le modèle donnera les droits 0666 (octal) aux nouveaux fichiers à l'intérieur des dossiers | 141 | // le modèle donnera les droits 0666 (octal) aux nouveaux fichiers à l'intérieur des dossiers |
138 | 142 | ||