From 6ae49c5a1bbca54dda8a39805b5ca85e2c42c0b0 Mon Sep 17 00:00:00 2001 From: "maieul@maieul.net" <> Date: Sun, 11 Dec 2016 13:18:35 +0000 Subject: [PATCH] =?UTF-8?q?d=C3=A9but=20de=20v=C3=A9rification=20de=20fich?= =?UTF-8?q?iers,=20pour=20le=20moment=20v=C3=A9rifier=20mime=5Ftype=20pr?= =?UTF-8?q?=C3=A9cis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes | 1 + lang/verifier_fr.php | 8 +++--- verifier/fichiers.php | 67 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 4 deletions(-) create mode 100755 verifier/fichiers.php diff --git a/.gitattributes b/.gitattributes index 542cd0d..973d888 100644 --- a/.gitattributes +++ b/.gitattributes @@ -46,6 +46,7 @@ verifier/email.php -text verifier/email.yaml -text verifier/entier.php -text verifier/entier.yaml -text +verifier/fichiers.php -text verifier/id_document.php -text verifier/id_document.yaml -text verifier/id_objet.php -text diff --git a/lang/verifier_fr.php b/lang/verifier_fr.php index 71bdc8a..4fd1d57 100644 --- a/lang/verifier_fr.php +++ b/lang/verifier_fr.php @@ -20,7 +20,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'erreur_date_format' => 'Le format de la date n’est pas accepté.', 'erreur_decimal' => 'La valeur doit être un nombre décimal.', 'erreur_decimal_nb_decimales' => 'Le nombre ne doit pas avoir plus de @nb_decimales@ chiffres après la virgule.', - 'erreur_dimension_image' => 'Le fichier @name@ est trop grand : @taille@ (maximum @taille_max@).', + 'erreur_dimension_image' => 'Le fichier « @name@ » est trop grand : @taille@ (maximum @taille_max@).', 'erreur_email' => 'L’adresse de courriel <em>@email@</em> n’a pas un format valide.', 'erreur_email_nondispo' => 'L’adresse de courriel <em>@email@</em> est déjà utilisée.', 'erreur_entier' => 'La valeur doit être un entier.', @@ -46,12 +46,12 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'erreur_siret' => 'Le numéro de SIRET n’est pas valide.', 'erreur_taille_egal' => 'La valeur doit comprendre exactement @egal@ caractères (actuellement @nb@).', 'erreur_taille_entre' => 'La valeur doit comprendre entre @min@ et @max@ caractères (actuellement @nb@).', - 'erreur_taille_image' => 'Le fichier @name@ est trop lourd : @taille@ (maximum @taille_max@).', + 'erreur_taille_image' => 'Le fichier « @name@ » est trop lourd : @taille@ (maximum @taille_max@).', 'erreur_taille_max' => 'La valeur doit comprendre au maximum @max@ caractères (actuellement @nb@).', 'erreur_taille_min' => 'La valeur doit comprendre au minimum @min@ caractères (actuellement @nb@).', 'erreur_telephone' => 'Le numéro n’est pas valide.', - 'erreur_type_image' => 'Le fichier @name@ n’est pas une image.', - 'erreur_type_non_autorise' => 'Le fichier @name@ n’est pas d’un type autorisé.', + 'erreur_type_image' => 'Le fichier « @name@ » n\'est pas une image.', + 'erreur_type_non_autorise' => 'Le fichier « @name@ » n\'est pas d\'un type autorisé.', 'erreur_url' => 'L’adresse <em>@url@</em> n’est pas valide.', 'erreur_url_protocole' => 'L’adresse saisie <em>(@url@)</em> doit commencer par @protocole@.', 'erreur_url_protocole_exact' => 'L’adresse saisie <em>(@url@)</em> ne commence pas par un protocole valide (http:// par exemple).', diff --git a/verifier/fichiers.php b/verifier/fichiers.php new file mode 100755 index 0000000..661f4fd --- /dev/null +++ b/verifier/fichiers.php @@ -0,0 +1,67 @@ +<?php + +// Sécurité +if (!defined("_ECRIRE_INC_VERSION")) { + return; +} + +/** + * Vérifier une saisie d'envoi de fichiers + * + * @param array $valeur + * Le sous tableau de $_FILES à vérifier, $_FILES['logo'] par exemple + * Doit être un champ avec un ou plusieurs upload + * @param array $options + * Options à vérifier : + * - mime au choix 'image','tous_spip','specifique' + * - mime_specifique (si l'option 'mime_specifique' est choisi ci-dessus) + * - taille_max (en Kio) + * - largeur_max (en px) + * - hauteur_max (en px) + * @param array &$erreurs_par_fichier + * Un tableau, passé par référence, qui contient le détail des erreurs fichier de $_FILES['fichier'] par fichier + * @return string + */ +function verifier_fichiers_dist($valeur, $options, &$erreurs_par_fichier) { + if (!is_array($valeur['tmp_name'])){//si on reçoit une info de type fichier unique, on bascule comme si on était fichier multiple + $old_valeur = $valeur; + $valeur = array(); + foreach ($old_valeur as $propriete=>$val){ + $valeur[$propriete][0] = $val; + } + } + + foreach ($valeur['tmp_name'] as $cle=>$tmp_name){//On parcourt tous les fichiers + if ($valeur['error'][$cle]!=0){//On vérifie uniquement les fichiers bien expediés + continue; + } + if ($erreur=verifier_fichier_mime($valeur,$cle,$options)){// On commence par vérifier le type + $erreurs_par_fichier[$cle] = $erreur; + } + } + if (!empty($erreurs_par_fichier)){ + return implode($erreurs_par_fichier,"<br />"); + } + return ''; +} + +/** + * Vérifier le mime type d'une saisie d'envoi de fichiers + * + * @param array $valeur + * Le sous tableau de $_FILES à vérifier, $_FILES['logo'] par exemple + * Doit être un champ plusieurs uploads + * @param int $cle + * La clé du tableau qu'on vérifie + * @param array $options + * Les options tels que passés à verifier_fichiers() + * @return string + */ +function verifier_fichier_mime($valeur,$cle,$options){ + if ($options['mime'] == 'specifique'){ + if (!in_array($valeur['type'][$cle],$options['mime_specifique'])){ + return _T('verifier:erreur_type_non_autorise',array('name'=>$valeur['name'][$cle])); + } + } + return ''; +} -- GitLab