From ce10c0ff1dd0b47bd494ae88ab2eaf6ab354b2b3 Mon Sep 17 00:00:00 2001 From: polo Date: Fri, 2 Jun 2023 01:21:06 +0200 Subject: filtre nom des images + reorg code Image --- controller/Security.php | 44 ++++++++++++++++++++++++++++++++++++++++++++ controller/ajax.php | 10 +++++++--- controller/ckeditor.php | 28 +++++++++++++++++++++++----- 3 files changed, 74 insertions(+), 8 deletions(-) (limited to 'controller') diff --git a/controller/Security.php b/controller/Security.php index 39205c1..3475a8d 100644 --- a/controller/Security.php +++ b/controller/Security.php @@ -20,6 +20,50 @@ class Security $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; } + + public static function secureFileName(string $chaine): string + { + // sécuriser un nom avec chemin avec basename? + //$chaine = basename($chaine); + + /* + - caractères interdits sous windows / \ : * ? " < > | + - mac autorise les / + - mac interdit : + - linux autorise tout sauf les / + - imagemagick ne supporte pas les : + + - 'espace' fonctionne + - / remplacé par firefox en : + - \ retire ce qui est devant le \ + - * fonctionne + - ? permet le téléchargement mais pas l'affichage + - " ne fonctionne pas, remplacé par %22, filtrer %22 + - < > fonctionnent + - | fonctionne + - = fonctionne, mais je filtre parce qu'on en trouve dans une URL + - ' ` fonctionnent + - % fonctionne + - (){}[] fonctionnent + - ^ fonctionne + - # ne fonctionne pas + - ~ fonctionne + - & fonctionne + */ + + // => on remplace tout par des _ + // filtrer / et \ semble inutile + + $cibles = [' ', '/', '\\', ':', '*', '?', '<', '>', '|', '=', "'", '`', '"', '%22', '#']; + return(str_replace($cibles, '_', $chaine)); + + // les problèmes avec \ persistent !! + // => javascript + // malheureusement document.getElementById('upload').files[0].name = chaine; ne marche pas! interdit! + // solution? + // créer une copie du fichier et l'envoyer à la place + // envoyer le nom souhaité au serveur en AJAX puis renommer avec PHP + } } // erreurs à la création des mots de passe diff --git a/controller/ajax.php b/controller/ajax.php index ed840cd..9272dea 100644 --- a/controller/ajax.php +++ b/controller/ajax.php @@ -17,7 +17,8 @@ if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_ else { require('model/Image.php'); - // vaut "true" parce qu'on reçoit une requête AJAX + require('controller/Security.php'); + // paramètre "true" parce qu'on reçoit une requête AJAX $Image = new Image($_GET['page'], $_GET['page'], true); // les données des albums sont dans le dossier discographie if($_GET['page'] === 'album') @@ -25,12 +26,15 @@ if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_ $Image->setFolder('discographie'); } - $Image->upload(); + $nomFichier = Security::secureFileName($_FILES['upload']['name']); + $Image->setFileName($nomFichier); + $Image->setThumbnailWidth(630); + $Image->upload(); echo($Image->reponseAjax); // attendu par l'éditeur // attention ici aux var_dump() ou echo() qui trainent - $Image->makeThumbnail(630); // => taille de la
+ $Image->makeThumbnail(); // => taille de la
// on pourra l'agrandir en cliquant dessus // code exécuté alors que l'utilisateur récupère la main } diff --git a/controller/ckeditor.php b/controller/ckeditor.php index 4d4639d..3765261 100644 --- a/controller/ckeditor.php +++ b/controller/ckeditor.php @@ -66,7 +66,7 @@ function submitCKeditor() if($_GET['page'] === 'discographie' || $_GET['page'] === 'album') { $Album = new Album($_GET['page'], 'discographie'); - + // on retrouve les données si nécessaire if(isset($_SESSION['file_code']) && $_SESSION['file_code'] != '') { @@ -76,10 +76,28 @@ function submitCKeditor() $nouveauTitre = Security::secureString($_POST['titre']); $nouvelleAnnee = Security::secureString($_POST['annee']); + + // enregistrement de l'image if(!empty($_FILES['upload']['name'])) { - $nouvellePochette = $_FILES['upload']['name']; - $nouvellePochetteMini = pathinfo($_FILES['upload']['name'], PATHINFO_FILENAME) . '-mini.' . pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION); + require('model/Image.php'); + $Image = new Image($_GET['page'], 'discographie', false); + $nomFichier = Security::secureFileName($_FILES['upload']['name']); + $Image->setFileName($nomFichier); + $Image->setThumbnailWidth(201); + + $nouvellePochette = $nomFichier; + /*$nouvellePochetteMini = pathinfo($_FILES['upload']['name'], PATHINFO_FILENAME) . '-mini.' . pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION);*/ + $nouvellePochetteMini = pathinfo($nomFichier, PATHINFO_FILENAME) . '-mini.' . pathinfo($nomFichier, PATHINFO_EXTENSION); + + $Image->upload(); + $Image->makeThumbnail(); + + $erreur = $Image->erreur; + if(!empty($erreur)) + { + // remettre pochette précédente si il y a + } } else { @@ -89,11 +107,11 @@ function submitCKeditor() //var_dump($nouvellePochetteMini); die(); - // enregistrement nouvel album + // enregistrement du texte JSON if(!isset($_SESSION['file_code']) || $_SESSION['file_code'] == '') { // page disco - $Album->createVignette($nouveauTitre, $nouvelleAnnee, $nouvellePochette, $nouvellePochetteMini); + $Album->createVignetteJSON($nouveauTitre, $nouvelleAnnee, $nouvellePochette, $nouvellePochetteMini); // page de l'album if(!empty($_POST['contenu'])) -- cgit v1.2.3