IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

GET et POST pour forcer le téléchargement


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 124
    Points : 310
    Points
    310
    Par défaut GET et POST pour forcer le téléchargement
    Bonjour de nouveau,

    Voici un nouveau problème.
    Dans ma section messagerie privée, je propose le téléchargement de pièces jointes.
    Dans l'idéal, je voudrai placer un bouton plutôt qu'un lien. Sauf que le bouton corrompt mes fichiers.

    Voici le code passant par $_GET:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    //lien de téléchargement
    echo '<a href="pj.php?pj='.$user->piece_jointe.'&token_lect_mess='.$token_lect_mess.'">telechargement</a>';
     
    // page de téléchargement -> pj.php
    session_start();
    if(isset($_GET['pj']) AND isset($_GET['token_lect_mess'])){
    	if($_SESSION['token_lect_mess'] == $_GET['token_lect_mess']) {
     
    $fichier = "pieces_jointes/".$_GET['pj'];
     
    switch(strrchr(basename($fichier), '.')) {
     
    case '.doc': $type = 'application/msword'; break;
    case '.docx': $type = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'; break;
    case '.xls': $type = 'application/vnd.ms-excel'; break;
    case '.xlsx': $type = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; break;
    case '.ppt': $type = 'application/vnd.ms-powerpoint'; break;
    case '.pptx': $type = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'; break;
    case '.pdf': $type = 'application/pdf'; break;
    case '.png': $type = 'image/png'; break;
    case '.jpg': $type = 'image/jpeg'; break;
    case '.txt': $type = 'text/plain'; break;
    default: $type = 'application/octet-stream'; break;
     
    }
     
    header('Content-disposition: attachment; filename='.$fichier);
    header('Content-Type: application/force-download');
    header('Content-Transfer-Encoding: $type\n');
    header('Content-Length: '.filesize($fichier));
    header('Pragma: no-cache');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0, public');
    header('Expires: 0');
    readfile($fichier);
    }
    else {
    		header ("Refresh: 1;URL=index.php");
    		echo "<div class='apres_valid'>Token erroné.</div>";
    		}
    }else {
    	header("Location:index.php");
    }
    Ce code fonctionne très bien, par contre, si je tape le nom d'une autre pièce jointe, alors je peux la télécharger... et ceci est fâcheux.


    Donc passant par $_POST:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    //bouton de téléchargement
    echo '
    <span class="contenair-mess-lu-repondre">
        <FORM method="POST" action="piece_jointe.php"> 
    	    <input type="hidden" name="piece_jointe" value="'.$user->piece_jointe.'" /> 
    	    <input type="image" src="'.$urlImg.'piece_jointe.png">
        </FORM>
    </span>';
     
    //page de téléchargement
    $fichier = "pieces_jointes/".$_POST['piece_jointe'];
     
    switch(strrchr(basename($fichier), '.')) {
     
    case '.doc': $type = 'application/msword'; break;
    case '.docx': $type = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'; break;
    case '.xls': $type = 'application/vnd.ms-excel'; break;
    case '.xlsx': $type = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; break;
    case '.ppt': $type = 'application/vnd.ms-powerpoint'; break;
    case '.pptx': $type = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'; break;
    case '.pdf': $type = 'application/pdf'; break;
    case '.png': $type = 'image/png'; break;
    case '.jpg': $type = 'image/jpeg'; break;
    case '.txt': $type = 'text/plain'; break;
    default: $type = 'application/octet-stream'; break;
     
    }
     
    header('Content-disposition: attachment; filename='.$fichier);
    header('Content-Type: application/force-download');
    header('Content-Transfer-Encoding: $type\n');
    header('Content-Length: '.filesize($fichier));
    header('Pragma: no-cache');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0, public');
    header('Expires: 0');
    readfile($fichier);
    Mais la, les téléchargements de pdf et txt fonctionnent bien, mais les fichier de type doc, png, jpg etc ne fonctionnent pas

    Quelqu'un a une idée svp?

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Tu récupères un fichiers donc c'est du GET que tu dois faire pas du POST.

    Si le fait de pouvoir modifier la pièce jointe te pose problème à toi d'ajouter une couche supplémentaire pour abstraire le nom de pièce jointe et/ou test les droits de téléchargement sur le fichier.

    Attention au session et au process long du type téléchargement , tu dois appeler le plus tôt possible session_write_close, sinon tu risque de bloquer les autres page utilisant la même session.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 124
    Points : 310
    Points
    310
    Par défaut
    Salut Grunk,
    Les fichiers ne peuvent pas dépaser les 2Mo, donc y a t il réellement un risque que ca bloque?
    Ensuite, pour ce qui est de la couche de sécurité supplémentaire, je ne sais pas du tout comment faire ça. tu aurais un début de piste stp?

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Citation Envoyé par jimmo Voir le message
    Les fichiers ne peuvent pas dépaser les 2Mo, donc y a t il réellement un risque que ca bloque?
    Ca va bloquer le temps que le script soit finit , c'est à dire le temps que readfile() est fait son travail.

    Citation Envoyé par jimmo Voir le message
    Ensuite, pour ce qui est de la couche de sécurité supplémentaire, je ne sais pas du tout comment faire ça. tu aurais un début de piste stp?
    Le plus simple est de camoufler le nom des pièces jointes en les encodant en base64 , l'utilisateur lambda ne le remarquera pas et ne pourra pas simplement changer le nom de la pièce jointe.
    Si tu as tes pièces jointes avec tes messages dans une bdd , il est assez simple de savoir si une pj est liée à un utilisateur ou non. Auquel cas modifier le nom de la pj n'as aucune importante puisque dans le pire des cas l'utilisateur ne pourra pas télécharger une pj qui ne lui est pas destinée.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [PHP 5.0] Fonction pour forcer le téléchargement
    Par hugoclo dans le forum Langage
    Réponses: 0
    Dernier message: 07/08/2011, 17h25
  2. Réponses: 5
    Dernier message: 23/01/2011, 01h49
  3. [Système] Problème pour forcer un téléchargement
    Par Spaeda dans le forum Langage
    Réponses: 2
    Dernier message: 25/09/2006, 10h02
  4. [Configuration] problème pour forcer le téléchargement d'un fichier
    Par All Bran dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 02/01/2006, 16h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo