From b97a68343ec5c4ff1fae25ff5dc41f1a2ce6a17f Mon Sep 17 00:00:00 2001 From: polo Date: Fri, 26 Nov 2021 04:29:10 +0100 Subject: =?UTF-8?q?disco=20modif/suppr=20d=C3=A9sordre?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller/Security.php | 23 +++++++++++++++++++++++ controller/admin.php | 26 ++++++++++++++------------ controller/ckeditor.php | 32 ++++++-------------------------- controller/visitor.php | 16 ++++++++-------- 4 files changed, 51 insertions(+), 46 deletions(-) create mode 100644 controller/Security.php (limited to 'controller') diff --git a/controller/Security.php b/controller/Security.php new file mode 100644 index 0000000..98d2e74 --- /dev/null +++ b/controller/Security.php @@ -0,0 +1,23 @@ +1, // protection contre les élements et attributs dangereux + 'elements'=>'h2, h3, h4, p, br, span, i, strong, u, mark, blockquote, li, ol, ul, a, figure, hr, img, figcaption, table, tbody, tr, td', // paramètre optionnel: les balises non indiquées sont supprimées + 'deny_attribute'=>'id', // gêner le JS hostile + // on garde 'class' et 'style' utilisés par le ckediteur + ); + private static $specHtmLawed = ''; // optionnel: faire qu'un certain élément puisse n'avoir que certains attributs + + public static function secureString($chaine) + { + $chaine = htmLawed($chaine, self::$configHtmLawed, self::$specHtmLawed); + $chaine = trim($chaine); // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine (pour l'entrée de l'éditeur) + return $chaine; + } +} diff --git a/controller/admin.php b/controller/admin.php index ba6fd83..90924e0 100644 --- a/controller/admin.php +++ b/controller/admin.php @@ -9,9 +9,8 @@ function melaineEdit($numArticle, $suppression) $page_actuelle = "melaine"; // modèle - $Article = new OneArticle($page_actuelle); - $Article->makeFileList(); - + $Article = new Page($page_actuelle, 'html'); + // nouvel article if($numArticle == 0) { @@ -22,7 +21,7 @@ function melaineEdit($numArticle, $suppression) { // nom de l'article ciblé (objet et session) $Article->findFileName($numArticle); - $_SESSION['nomFichier'] = $Article->getFileName(); + $_SESSION['nomFichier'] = $Article->fileName; // suppression if($suppression) @@ -62,13 +61,13 @@ function melaineEdit($numArticle, $suppression) require('view/template.php'); } -function discoEdit($numArticle, $suppression) +function discoEdit($numArticle, $albumCode, $suppression) { $page_actuelle = "discographie"; $title = "Discographie"; // modèle - $Album = new OneArticle($page_actuelle); + $Album = new Album($page_actuelle); $Album->makeFileList(); // nouvel album @@ -81,7 +80,7 @@ function discoEdit($numArticle, $suppression) { // nom de l'article ciblé (objet et session) $Album->findFileName($numArticle); - $_SESSION['nomFichier'] = $Album->getFileName(); + $_SESSION['nomFichier'] = $Album->fileName; // suppression if($suppression) @@ -94,7 +93,8 @@ function discoEdit($numArticle, $suppression) else { $title = "Modifier un album"; - $texte = $Album->readOne(); // entrée de l'éditeur + $texte = $Album->readOneAlbum($albumCode); + $vignette = json_decode($Album->getVignette(), true); } } @@ -106,11 +106,10 @@ function discoEdit($numArticle, $suppression) $texte = preparationCKeditor($numArticle, $texte); } - // contenu de tous les fichiers JSON (= tableau de chaines) $albumsJSON = $Album->readAll(); // noms des fichiers JSON - $albumNamesJSON = $Album->getFileList(); + $albumNamesJSON = $Album->fileList; // changer les chaines JSON en tableaux: titre, année, pochette $i = 0; @@ -124,13 +123,15 @@ function discoEdit($numArticle, $suppression) $annees[$i] = $albumsJSON[$i][1]; $i++; } + print_r($albumsJSON); + //exit(); // tri d'un tableau multidimensionnel array_multisort($annees, $albumsJSON); // on passe maintenant au contenu HTML - $Album->setFormat('html'); + $Album->format = 'html'; $Album->makeFileList(); - $albumNamesHTML = $Album->getFileList(); + $albumNamesHTML = $Album->fileList; // lien vers le HTML ou ancre? // pour chaque album, détecter le fichier html @@ -149,6 +150,7 @@ function discoEdit($numArticle, $suppression) if(file_exists('data/discographie/html/' . $nomJSONsansExt . '.html')) { $lienAlbum[$i] = 'album&album_code=' . $nomJSONsansExt . '&album_name=' . $albumsJSON[$i][0]; + $lienBoutonModif[$i] = 'discographie&action=edition&album_code=' . $nomJSONsansExt; $avecLien[$i] = true; } else diff --git a/controller/ckeditor.php b/controller/ckeditor.php index d07f2a2..2b9f168 100644 --- a/controller/ckeditor.php +++ b/controller/ckeditor.php @@ -52,28 +52,15 @@ function submitCKeditor($nomFichier) exit(); } - // sécurité faille XSS avec htmLawed - $configHtmLawed = array( - 'safe'=>1, // protection contre les élements et attributs dangereux - 'elements'=>'h2, h3, h4, p, br, span, i, strong, u, mark, blockquote, li, ol, ul, a, figure, hr, img, figcaption, table, tbody, tr, td', // paramètre optionnel: les balises non indiquées sont supprimées - 'deny_attribute'=>'id', // gêner le JS hostile - // on garde 'class' et 'style' utilisés par le ckediteur - ); - $specHtmLawed = ''; // optionnel: faire qu'un certain élément puisse n'avoir que certains attributs - // de l'éditeur if(isset($_POST['contenu'])) // optionnel pour discographie { - $contenu = $_POST['contenu']; + $contenu = Security::secureString($_POST['contenu']); // récupérer les liens multimedia //require("media.php"); //$contenu = mediaSubmit($contenu); - $contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed); - // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine (pour l'entrée de l'éditeur) - $contenu = trim($contenu); - // ne pas continuer si la variable est vide (javascript mal supporté ou utilisation de IE, bug?, erreur de l'utilisateur), risque perte de contenu !! if($page != 'discographie' && $contenu == '') { @@ -82,18 +69,11 @@ function submitCKeditor($nomFichier) } } - if($page == 'discographie') { - $titre = $_POST['titre']; - $annee = $_POST['annee']; + $titre = Security::secureString($_POST['titre']); + $annee = Security::secureString($_POST['annee']); $pochette = $_FILES['upload']['name']; - - // des formulaires simples - $titre = htmLawed($titre, $configHtmLawed, $specHtmLawed); - $titre = trim($titre); - $annee = htmLawed($annee, $configHtmLawed, $specHtmLawed); - $annee = trim($annee); // on instancie avec l'enfant de OneArticle $Album = new Album($page); @@ -103,7 +83,7 @@ function submitCKeditor($nomFichier) { // page disco $Album->createVignette($titre, $annee, $pochette); - + // page de l'album if(!empty($_POST['contenu'])) { @@ -125,7 +105,7 @@ function submitCKeditor($nomFichier) // autres pages else { - $Article = new OneArticle($page); + $Article = new Page($page, 'html'); if($_GET['article'] == 0) { @@ -133,7 +113,7 @@ function submitCKeditor($nomFichier) } else { - $Article->setFileName($nomFichier); + $Article->fileName = $nomFichier; $Article->update($contenu); } } diff --git a/controller/visitor.php b/controller/visitor.php index a5bf538..0e79ee2 100644 --- a/controller/visitor.php +++ b/controller/visitor.php @@ -33,8 +33,9 @@ function melaineVisitor() $title = "Mais qui est Melaine Favennec?"; // modèle - $Articles = new AllArticles($page_actuelle); - $Articles->makeFileList(); + $Articles = new Page($page_actuelle, 'html'); + + // récupération de toute la page dans $articles $articles = array_reverse($Articles->readAll()); // lourd // variables $css, $js, $header et $content @@ -53,9 +54,9 @@ function discoVisitor() $AllAlbums->makeFileList(); // contenu de tous les fichiers JSON (= tableau de chaines) - $albumsJSON = $AllAlbums->readAll(); + $albumsJSON = array_reverse($AllAlbums->readAll()); // noms des fichiers JSON - $albumNamesJSON = $AllAlbums->getFileList(); + $albumNamesJSON = $AllAlbums->fileList; // changer les chaines JSON en tableaux: titre, année, pochette $i = 0; @@ -74,9 +75,9 @@ function discoVisitor() array_multisort($annees, $albumsJSON); // on passe maintenant au contenu HTML - $AllAlbums->setFormat('html'); + $AllAlbums->format = 'html'; $AllAlbums->makeFileList(); - $albumNamesHTML = $AllAlbums->getFileList(); + $albumNamesHTML = $AllAlbums->fileList; // lien vers le HTML ou ancre? // pour chaque album, détecter le fichier html @@ -121,8 +122,7 @@ function album($albumCode, $albumName) $page_actuelle = 'discographie'; $title = $albumName; - //$Album = new OneArticle ($page_actuelle); - $album = OneArticle::readOneAlbum($albumCode); + $album = Album::readOneAlbum($albumCode); // simple, efficace // variables $css, $header et $content require('view/album.php'); -- cgit v1.2.3