Project

General

Profile

Anomalie #3234

Upload gros fichiers : detecter dans le verifier() du formulaire upload

Added by Eric Camus almost 7 years ago. Updated almost 6 years ago.

Status:
Fermé
Priority:
Normal
Assignee:
-
Target version:
Start date:
06/19/2014
Due date:
% Done:

0%

Resolution:
duplicate
Navigateur:

Description

Bonjour,

Avec SPIP 3.0.16 sans plugins (sur serveur WIMP et LAMP).

Si on demande le téléchargement d'un poids de fichiers (un ou plusieurs) supérieur à POST_MAX_SIZE on se retrouve avec la page d'édition de l'article dans lequel on était dans le cadre de téléchargement : c'est super chouette artistiquement mais c'est tout (cf P.J.).

Pour résoudre ce problème, j'ai placé dans 'mes_options.php' le code suivant qui permet d'afficher un texte dans le cadre :

// capturer un formulaire post en surcharge !!!
if($_SERVER['REQUEST_METHOD']=='POST' and strlen($_SERVER['CONTENT_TYPE'])>0 and
    substr($_SERVER['CONTENT_TYPE'],0,19)=='multipart/form-data' and
    $_SERVER['CONTENT_LENGTH']>inigetoctets('post_max_size')) {
    // on est en hors quota donc erreur
        echo '<div style="background-color: #fbe3e4; padding:3px;"><p><b>Erreur de chargement :</b>
            <br />le poids total des fichiers dépasse la limite autorisée ('.ini_get('post_max_size').
            'o).<br /><b>Pour recommencer</b>, veuillez recharger cette page.</p></div>';
        exit;
}

function inigetoctets($var) {
    $val=trim(ini_get($var));
    if($val!='') {
        $last=strtolower($val[strlen($val)-1]);
    }
    else {
        $last='';
    }
    switch($last) { // The 'G' modifier is available since PHP 5.1.0
        case 'g':
            $val*=1024;
        case 'm':
            $val*=1024;
        case 'k':
            $val*=1024;
    }
    return $val;
}

Comme il me semble que les formulaires de téléchargement sont dans des cadres 'java' cela ne doit pas poser d'autres problèmes ?
Si c'est le cas, il faudrait envisager de placer un code de ce type quelque part dans le core de SPIP pour pallier à tout formulaire de téléchargement.

Nota : si taille des données POST > POST_MAX_SIZE alors les variables $_POST et $_FILES sont vides.

[SPIP BRUT de pomme Version 3.0.16] Nouvel article N° 9.png View - Après upload d'un fichier trop gros (>post_max_size) (68.6 KB) Eric Camus, 06/19/2014 03:25 PM

History

#1 Updated by Peet du almost 7 years ago

Je viens de tester et effectivement ça marche bien.
J'ai juste modifié les lignes suivantes
// on est en hors quota donc erreur echo '<div style="background-color: #fbe3e4; padding:3px;"><p><b>Erreur de chargement :</b> <br />le poids total des fichiers d&eacute;passe la limite autoris&eacute;e ('.ini_get('post_max_size'). 'o).<br /><b>Pour recommencer</b>, veuillez <a href='.$_SERVER['REQUEST_URI'].'>recharger cette page</a>.</p></div>'; exit();

#2 Updated by cedric - over 6 years ago

  • Subject changed from Upload gros fichiers to Upload gros fichiers : detecter dans le verifier() du formulaire upload
  • Target version set to 3.1

C'est en principe corrigé en SPIP 3.1, il y a une verification generique sur les erreurs de POST ajax qui evitera ce genre de désagrément.
Mmais il serait mieux de tester ça directement dans le verifier du formulaire d'upload donc, pour avoir un message bien contextuel

#3 Updated by cedric - over 6 years ago

  • Status changed from Nouveau to Fermé
  • Resolution set to duplicate

voir #2699

#4 Updated by cedric - over 6 years ago

Corrigé par http://zone.spip.org/trac/spip-zone/changeset/85603 (merci pour la piste de patch et l'analyse !)

#5 Updated by marcimat 🌻 almost 6 years ago

Je viens de tomber sur ce code donc, dans medias. Et je m'étonne des calculs implémentés.

  1. C'est la même multiplication pour 'g', 'm', 'k' ; normal ?
  2. $val, il a au moment de la multiplication encore la lettre à la fin ; normal ?

#6 Updated by marcimat 🌻 almost 6 years ago

Bon, le point 1) c'est normal, pour "G", en fait il passe dans TOUS les 'case:' (vu que y a pas de break;)
Reste le point 2) à mon sens qui est un oubli. (http://stackoverflow.com/questions/13076480/php-get-actual-maximum-upload-size)

#8 Updated by Eric Camus almost 6 years ago

Pour le point 2 : http://php.net/manual/fr/language.types.string.php#language.types.string.conversion
Une chaine dans une opération arithmétique est forcément converti en nombre.
C'est d'ailleurs un truc et astuce que j'utilise pour extraire seulement un nombre d'une input : $x=0+$_REQUEST['in']; donnera toujours un chiffre (entier ou float !).
Donc pas besoin d'extraire la lettre, à la rigueur changer le return $val; en return (0+$val); en cas de lettre non comprise.

Also available in: Atom PDF