Changeset 101252 in spip-zone


Ignore:
Timestamp:
Dec 21, 2016, 10:31:44 AM (3 years ago)
Author:
maieul@…
Message:

securité : si un fichier à une paire (extension,mime) inconnue, on zip. Cela évite de permettre de balancer par négligence un .htaccess dans config/fichiers/formidable/formulaire_x/reponse_y/champ_z

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/formidable/branches/v3_dev/inc/formidable_fichiers.php

    r101224 r101252  
    7474 *
    7575 * @param string $fichier l'adresse temporaire du fichier
    76  * @param string $nom le nom du fichiera
     76 * @param string $nom le nom du fichier
     77 * @param string $mime le mime du fichier
     78 * @param string $extension l'extension du fichier
    7779 * @param string $champ le champ concerné
    7880 * @return string $nom_definitif le nom définitif du fichier tel que stocké dans son dossier, vide s'il y a eu un souci lors du déplacement (dans ce cas un courriel sera envoyé au webmestre)
    7981 *
    8082 **/
    81 function formidable_deplacer_fichier_emplacement_definitif($fichier, $nom, $champ, $options){
     83function formidable_deplacer_fichier_emplacement_definitif($fichier, $nom, $mime, $extension, $champ, $options){
    8284        if (isset($options['id_formulaire'])) {
    8385                $id_formulaire = $options['id_formulaire'];
     
    9597                return '';
    9698        }
    97         // déterminer l'extension
    98         $path_info = pathinfo($nom);
    99         $basename = $path_info['basename'];
    100         $extension = $path_info['extension'];
     99        // déterminer le basename
     100        $basename = pathinfo($nom, PATHINFO_BASENAME);
     101
     102        // sécurité : si la combinaison extension/mime_type est inconnu de SPIP (spip_documents_type), on zip.
     103        // On n'utilise volontairement pas verifier/fichiers.php, dès fois que celui-ci évolue dans le future
     104        $res = sql_select('mime_type','spip_types_documents','mime_type='.sql_quote($mime).' and extension='.sql_quote($extension));
     105        if (sql_count($res) == 0) {
     106                $zipper = True;
     107                $nom_dans_zip = $nom;
     108                // pas de fichier nom de zip commencant par point
     109                while (strpos($basename,'.') === 0){
     110                        $basename = substr($basename,1);               
     111                }
     112                $nom = "$basename.zip";
     113        } else {
     114                $zipper = False;       
     115        }
    101116        if (!isset($options['timestamp'])) { // si on enregistre la réponse en base
    102117
     
    119134                $dossier_champ = sous_repertoire($dossier,$champ,false,true);
    120135        }
    121 
    122136        // S'assurer qu'il n'y a pas un fichier du même nom à destination
    123137        $chemin_final = $dossier_champ.$nom;
     
    128142                $n++;
    129143        }
    130         // On peut déplacer le fichier
    131         if ($fichier = deplacer_fichier_upload($fichier, $chemin_final,true)){
    132                 return $nom;
    133         }
    134         else{
    135                 return '';
    136         }
    137 
     144        if (!$zipper) { // si on ne zippe pas, c'est simple
     145                if ($fichier = deplacer_fichier_upload($fichier, $chemin_final,true)) {
     146                        return $nom;
     147                } else {
     148                        return '';
     149                }
     150        } else { // si on doit zipper, c'est plus complexe
     151                include_spip('inc/pclzip');
     152                $zip = new PclZip($chemin_final);
     153                if (!$tmp_dir = tempnam($dossier_champ, 'tmp_upload')) {
     154                        return '';
     155                }
     156                spip_unlink($tmp_dir);
     157                @mkdir($tmp_dir);
     158                $old_fichier = $fichier;
     159                if (!$fichier = deplacer_fichier_upload($fichier,$tmp_dir."/".$nom_dans_zip,false)) {
     160                        return '';
     161                }
     162                $zip_final = $zip -> create($fichier,
     163                        PCLZIP_OPT_REMOVE_PATH, $tmp_dir,
     164                        PCLZIP_OPT_ADD_PATH, '');
     165                if (!$zip_final){
     166                        return '';
     167                } else {
     168                        spip_unlink($old_fichier);
     169                        effacer_repertoire_temporaire($tmp_dir);
     170                        return $nom;
     171                }
     172        }
     173
     174        return $nom;
    138175}
    139176
     
    189226                        if ($nouveau_nom = formidable_deplacer_fichier_emplacement_definitif(
    190227                                $mon_file['tmp_name'][$i],
    191                                 $mon_file['name'][$i], 
     228                                $mon_file['name'][$i],
     229                                $mon_file['type'][$i],
     230                                pathinfo($mon_file['name'][$i], PATHINFO_EXTENSION),   
    192231                                $champ,
    193232                                $options
Note: See TracChangeset for help on using the changeset viewer.