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 :

Protéger un sous répertoire et son contenu d'un accès direct


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de Baldy
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 223
    Points : 128
    Points
    128
    Par défaut Protéger un sous répertoire et son contenu d'un accès direct
    Bonjour

    Ayant vu une faille sur un site je me suis empresser de la corriger. En effet le sous répertorie "upload" était accessible librement. Pour celui ci j'ai simplement corrigé le soucis en y mettant une page index.html avec une rediction automatique vers l'index de l'accueil du site. Mais les fichiers sont toujours accessibles si on connait leur nom.

    Sachant que le site est acessible uniquement via un login/mdp, comment devrais procéder si je veut empêcher l'accès à ces fichiers SAUF si on est loggé correctement?

    Merci

  2. #2
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Salut,

    Tu peux faire ainsi:

    1) tu mets un .htaccess qui interdit l'accès http
    2) tu crée une page php hors de ce dossier qui permet de servir les fichiers.
    par exemple: download.php?file=nom_du_fichier et dans ton code tu vérifie
    la session et tu sers le fichier avec readfile par exemple. (ajoute les headers
    appropriés)
    3) (éventuellement) tu fais un url rewriting pour redonner des urls similaire à avant.
    dans le genre: /fichiers/toto.jpg => /download.php?file=toto.jpg

    dans download.php un peu de sécurité s'impose pour éviter de permettre à tes
    utilisateurs de télécharger des fichiers ailleurs que depuis le dossier voulu.
    Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !

  3. #3
    Membre habitué Avatar de Baldy
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 223
    Points : 128
    Points
    128
    Par défaut
    J'ai tenté l'idée du .htaccess mais evidemment ça bloque aussi l'accès aux fichiers (PDF dans le cas précis) quand on veut les consuklter via le site en étant correctement logué.

    Maintenant je ne suis pas sur d'avoir compris ton idée avec le fichier annexe

  4. #4
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Citation Envoyé par Baldy Voir le message
    Maintenant je ne suis pas sur d'avoir compris ton idée avec le fichier annexe
    C'est la clé du problème

    en bloquant complètement un répertoire avec un .htaccess tu empêche apache
    de servir son contenu.

    par contre tu peux aller lire les fichiers depuis php. Il y a plusieurs manières de
    faire, mais regarde déjà un peu la fonction readfile celle-ci
    permet de lire un fichier sur le disque et de l'envoyer au client.

    Regarde les exemples dans la doc, tu verra c'est pas sorcier
    Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !

  5. #5
    Membre habitué Avatar de Baldy
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 223
    Points : 128
    Points
    128
    Par défaut
    Dis moi si j'ai bien compris le principe.

    La fonction permet de mettre les infos du fichier concerné en mémoire et les retransmet ensuite au poste client?

  6. #6
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    oui c'est juste.

    sauf que le fichier n'est pas chargé dans son entier en mémoire avant d'être envoyé, cela se passe par paquets pour éviter d'utiliser trop de mémoire. (un flux avec un tampon) mais la manière exact du fonctionnement change rien à
    la solution :-)

    C'est assez similaire à ce qu'apache fait quand il sert un fichier en fait.
    Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !

  7. #7
    Membre habitué Avatar de Baldy
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 223
    Points : 128
    Points
    128
    Par défaut
    Donc ultime question : est ce que je peut mettre un fichier .htacess dans le répertoire pour empêcher tout accès non voulu, et utiliser la fonction readfile pour afficher le PDF voulu sans que ça bloque?

  8. #8
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Oui, pour autant que le fichier php qui contient le readfile ne soit
    pas dans le dossier bloqué

    par exemple:

    /fichiers/
    - .htaccess
    - toto.pdf
    - titi.pdf

    /download.php

    dans download.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
    $file = $_GET['file'];
    header('Content-type: ...');
    header('Content-length: ...');
    readfile('fichiers/'.$file);
    ?>
    ensuite les liens qui permettent d'accéder aux pdf ne sont plus
    du genre: http://www.tonsite.com/fichiers/toto.pdf mais
    http://www.tonsite.com/download.php?file=toto.pdf

    mais avec l'url rewriting tu pourrais demander à apache
    de transformer automatiquement les liens, et ne faire
    aucun changement d'urls.
    Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !

  9. #9
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,

    Oui, pour autant que le fichier php qui contient le readfile ne soit
    pas dans le dossier bloqué
    readfile fonctionnera quand même car il est lancé à partir du serveur, ce n'est pas une requête venant de l'extérieur.

  10. #10
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Citation Envoyé par ThomasR Voir le message
    Bonjour,
    readfile fonctionnera quand même car il est lancé à partir du serveur, ce n'est pas une requête venant de l'extérieur.
    @ThomasR, Relis bien ce que j'ai écrit.

    Bien sur que readfile fonctionnera quand même. mais la page download.php
    sera inaccessible si elle est dans le dossier protégé.
    Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !

  11. #11
    Membre habitué Avatar de Baldy
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 223
    Points : 128
    Points
    128
    Par défaut
    Bon alors pour tetner de finaliser mon affaire je voudrais une dernière réponse.

    A l'heure actuelle le lien renvoi vers une page de traitement qui au final fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Location: ...");
    Donc le fichier est affiché dans une nouvelle page ou un lien de téléchargement est lancé (si c'est un .dic par exemple).

    Donc si dans ce même fichier je remplace le header par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $file = $_GET['file'];
    readfile('fichiers/'.$file);
    Il ne me reste plus qu'à remplacer mon lien par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="download.php?file='.$file.'">
    J'ai bon?

  12. #12
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Oui, ça me semble correct.

    Tu peux tester en tapant directement l'url download.php?file=toto.pdf
    Ce qui doit te charger ton fichier toto.pdf

    Ensuite il te faudra ajouter toi-même les headers appropriés. (ce que
    fait apache quand tu demande un fichier, mais qu'il ne fait pas dans ce
    cas là)

    Surtout le Content-type et le Content-length, un exemple de download.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
      $file = $_GET['file'];
      $pi = pathinfo($file);
      // ajouter de la sécurité ici pour interdire au client de choisir des chemins remontants (../../etc/passwd) :-)
      $ext = $pi['extension'];
      if($ext=='pdf') $mimeType = 'application/pdf';
      else die(); // voir améliorations ci-après
      $path = 'fichiers/'.$file;
      $size = filesize($path);
      header("Content-Type: $mimeType");
      header("Content-Length: $size");
      readfile($path);
    ?>
    Ensuite tu peux améliorer ceci avec pleins d'options sympa.

    1) Gestion du cache basé sur la date de modification des fichiers (filemtime)
    2) Gestion des erreurs si les fichiers sont pas trouvés (404, ou fichier par défaut)
    3) Gestion du taux de download (readfile convient pas pour ça)
    4) Url rewriting pour que tes liens download.php?file=toto.pdf redeviennent dans
    le genre /downloads/toto.pdf
    5) Et bien sur... renvoyer un code HTTP approprié si l'utilisateur n'est pas logué.

    A ce propos il me semble que le code 401 est utilisé pour ça, mais dans le cas
    d'un login géré par php et non par apache je ne sais pas si ce code est utilisable,
    qqn a une idée ?
    Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !

  13. #13
    Membre habitué Avatar de Baldy
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 223
    Points : 128
    Points
    128
    Par défaut
    Je suis perdu je crois ^^

    Je vais essayer de vous expliquer ce qui est en place actuellement
    J'ai un page qui liste les différents fichiers voulus et affiche un lien pour chacun
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '<a href="compteur_upload.php?rubrique_id='.$rubrique_id.'&amp;fichier_upload_id='.$fichierUp['fichier_upload_id'].'" target="_blank">'.stripslashes($fichierUp['fichier_upload_titre']).'</a><br />' ;
    Ce lien renvoi les informations vers une seconde page qui, après requêtes et traitement, a cette fin de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $lien = "Location: http://www.monsite.fr/upload/".$nbCompt['fichier_chemin'];
    // Redirection vers le lien sélectionné
    header($lien);
    die();
    echo "Le lien n'a pu &ecirc;tre trouv&eacute;.";
    Ce qui a pour effet d'ouvrir une nouvelle page/onglet vers le fichier (ou bien une fenêtre de téléchargement si c'est un .doc, .xls, etc...).

    Et c'est là que je ne sais pas quoi modifier.

  14. #14
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Salut,

    Je pense que cette page de redirection ne sert plus à rien

    je vois le terme "upload" dans tes liens, tu parles bien de téléchargement vers
    le poste client non ? et pas de transfert du client vers le serveur ?

    As-tu déjà crée ta page download.php?file=toto.pdf et testé directement depuis
    la barre d'adresse du navigateur ?
    Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !

  15. #15
    Membre habitué Avatar de Baldy
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 223
    Points : 128
    Points
    128
    Par défaut
    Oui les fichiers sont dans le dossier upload mais en fait ce sont les fichiers qui ont été uploadés par le passé en quelque sorte ^^, mais ce sont bien des fichiers que le client télécharge (ou consulte).

    Donc si je comprend bien la fonction de redirection ne sert plus à rien, il faudrait que je la remplace par ce code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
      $file = $_GET['file'];
      $pi = pathinfo($file);
      // ajouter de la sécurité ici pour interdire au client de choisir des chemins remontants (../../etc/passwd) :-)
      $ext = $pi['extension'];
      if($ext=='pdf') $mimeType = 'application/pdf';
      else die(); // voir améliorations ci-après
      $path = 'fichiers/'.$file;
      $size = filesize($path);
      header("Content-Type: $mimeType");
      header("Content-Length: $size");
      readfile($path);
    ?>

  16. #16
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Oui, tes liens doivent appeler cette page.

    Mais avant ça, teste là pour voir si elle fonctionne et te permet
    de télécharger un fichier en tappant directement download.php?file=toto.pdf
    dans la barre d'adresse de ton navigateur.
    Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !

  17. #17
    Membre habitué Avatar de Baldy
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 223
    Points : 128
    Points
    128
    Par défaut
    J'ai remplacer ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $lien = "Location: http://www.monsite.fr/upload/".$nbCompt['fichier_chemin'];
    // Redirection vers le lien sélectionné
    header($lien);
    die();
    echo "Le lien n'a pu &ecirc;tre trouv&eacute;.";
    Par ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $file = '3.pdf';
    $pi = pathinfo($file);
    // ajouter de la sécurité ici pour interdire au client de choisir des chemins remontants (../../etc/passwd) :-)
    $ext = $pi['extension'];
    if($ext=='pdf') $mimeType = 'application/pdf';
    else die(); // voir améliorations ci-après
    $path = 'upload/'.$file;
    $size = filesize($path);
    header("Content-Type: $mimeType");
    header("Content-Length: $size");
    readfile($path);
    Le fichier (PDF) s'affiche toujours dans une nouvelle page, donc pas de modification pour le client, ça a l'air de bien fonctionné.

    A ce moment la puis je mettre un fichier .htaccess dans le répertoire upload pour bloquer la visualisation des fichiers en direct?

  18. #18
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Oui, il t'aurait suffit de tester pour avoir la réponse
    Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !

  19. #19
    Membre habitué Avatar de Baldy
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 223
    Points : 128
    Points
    128
    Par défaut
    Ca oui, mais je ne sais pas quoi mettre dans ce fichier pour bloquer complètement le répertoire et les fichiers qui sont dedans.

  20. #20
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Une petite recherche sur le forum

    bloquer un répertoire
    Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/03/2011, 15h56
  2. Réponses: 2
    Dernier message: 08/09/2007, 18h09
  3. Déplacer un répertoire et son contenu
    Par choubiroute dans le forum Langage
    Réponses: 6
    Dernier message: 28/04/2006, 12h59
  4. Réponses: 9
    Dernier message: 24/10/2005, 18h42
  5. Comment copier un répertoire et son contenu ?
    Par yoghisan dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 20/06/2004, 17h40

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