summaryrefslogtreecommitdiff
path: root/controller
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2022-03-10 03:12:58 +0100
committerpolo <ordipolo@gmx.fr>2022-03-10 03:12:58 +0100
commitf331b3ab14f2b404c2089607aba2e2d434cd510d (patch)
tree09ecb84aa9db383f661d9e9a064b0d3d13d40a8b /controller
parent608856e0853b7e1d9b9b43e69b2012227ccefb43 (diff)
downloadmelaine-f331b3ab14f2b404c2089607aba2e2d434cd510d.zip
fichiers index.php
Diffstat (limited to 'controller')
-rw-r--r--controller/Security.php6
-rw-r--r--controller/backup.php70
-rw-r--r--controller/ckeditor.php40
-rw-r--r--controller/installation.php38
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
5require('lib/htmlawed/htmLawed.php');
6
7class Security 4class 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 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... 155function fixLinks($data)
153 156{
154function 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