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 l'accès à un répertoire


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    742
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 742
    Par défaut Protéger l'accès à un répertoire
    Bonjour,

    Sur un site marchand importance moyenne, un répertoire contient les factures des clients.

    Le nom d'une facture est composé du n° et de la date d'émission.

    2154658-20111117.pdf

    Cela est non-sécurisé et en se donnant un peu de mal il est possible d'accéder à chaque facture.

    La solution la plus simple semble être de coder le nom de la facture.

    Quelle fonction PHP utiliseriez-vous pour le codage ?

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Le plus simple resterai de mettre une règle au niveau du serveur pour interdire l'accès à tous sauf au serveur.
    Avec un .htaccess c'est faisable.

    Car PHP ne t'aidera pas à grand chose pour protéger un accès ne transitant pas par un script PHP. (cas de taper l'url directement dans le navigateur)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    742
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 742
    Par défaut
    Bonjour,

    Merci de ta réponse mais il faut que le titulaire de la facture puisse accéder à sa facture.

    L'accès au répertoire en direct est déjà interdit par le serveur.

    url/factures/
    INTERDIT

    url/factures/numéro.pdf
    Permis

    Quand tu as compris ça, tu peux (en théorie) piquer les factures qui ne sont pas les tiennes en changeant les numéros.

    Mon idée est simplement de coder le numéro avec une fonction PHP.

    Il existe plusieurs fonction de codage, quelle est la mieux appropriée ?

    Merci d'avance.

  4. #4
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Hum j'aurais du détailler.
    Le but est d'interdire l'accès à tout fichier du répertoire par une autre IP que celle du serveur.
    Ensuite tu mets un script d'accès (PHP : readfile et un header) vers le fichier du client, ce dernier est censé se logguer je suppose non ? Donc le script a ses informations et a la liste des factures associées et peut faire la vérification d'accès.

    Sinon si tu souhaites rester sur de l'encodage, on peut voir du côté des hash (md5, sha) ou bien plutôt du cryptage pour éviter les similitudes (pour le md5 on peut avoir le même hash pour deux valeurs différentes théoriquement, par contre je ne sais pas pour la sha).

  5. #5
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    Déplace c fichier en dehors d'un acces web.
    Et en PHP tu fait un accès en écrivant le header pdf.
    Mais tout cela suppose que tu es un système de protection login de tes utilisateurs.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    742
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 742
    Par défaut
    Merci de vos réponses mais je ne comprends pas bien.

    Il est vrai que je ne connais pas les techniques serveur.

    Et en PHP tu fait un accès en écrivant le header pdf.
    L'utilsateur va bien connaître le chemin d'accès au répertoire, non ?

    Je suppose que transgohan propose la même chose.

    Autrement, l'accès au lien pour obtenir la facture est effectivement en zone protégée par mot de passe.

    J'ai constaté que la plupart des factures reçus par Internet sont codées, d'où l'idée du code...

  7. #7
    Membre Expert
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Par défaut
    Dans la solution que te propose transgohan le client n'as pas à connaitre l'endroit où est logé le fichier sur ton serveur. Seul l'adresse du script PHP lui suffiras.

  8. #8
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Citation Envoyé par boteha Voir le message
    Merci de vos réponses mais je ne comprends pas bien.

    Il est vrai que je ne connais pas les techniques serveur.



    L'utilsateur va bien connaître le chemin d'accès au répertoire, non ?

    Je suppose que transgohan propose la même chose.

    Autrement, l'accès au lien pour obtenir la facture est effectivement en zone protégée par mot de passe.

    J'ai constaté que la plupart des factures reçus par Internet sont codées, d'où l'idée du code...
    Même s'il connait le lien, vu qu'il n'est pas connecté en tant que Mr ou Mme X le lien le renverra vers une erreur. A savoir qu'avec une configuration .htaccess (ou bien en mettant le fichier hors espace web comme proposé plus haut par themadmax) on ne peut avoir un accès direct, seul un script sur le serveur peut accéder au fichier. Or ce fichier n'accède qu'aux factures de l'utilisateur connecté.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    742
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 742
    Par défaut
    D'accord, je crois comprendre assez pour faire un essai.

    Je vous tiens au courant.

    Merci.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    742
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 742
    Par défaut
    Bonjour,

    J'ai crée un dossier "factures" dans le dossier hdocs parent de www.

    Est-ce bien ce que vous appelez un espace hors Web inaccessible depuis un navigateur ?

    Je mets dans ce dossier une facture.pdf.

    J'arrive à vérifier l'existence du fichier avec file_exists (../factures/facture.pdf).

    Par contre, veuillez excuser le boulet, je n'arrive pas à récupérer le PDF

    header ("location:url/../factures/facture.pdf") ne marche pas.

    Merci d'avance.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    742
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 742
    Par défaut
    Re-bonjour,

    Je crois comprendre qu'il faut utiliser la fonction readfile ().

    Mais je suppose que readfile provoque un téléchargement.

    Personnellement, je trouve plus convivial d'afficher le PDF directement dans une fenêtre du navigateur.

    Y a-t-il une solution ?

    Merci d'avance.

  12. #12
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Ce n'est pas readfile() qui va faire ça mais le header() (qui indiquera le type de données affiché).
    Cela dit ce n'est pas toi qui va choisir si le fichier doit être téléchargé ou non, au final c'est la configuration du navigateur qui va y être pour beaucoup.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    742
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 742
    Par défaut
    Merci de ta réponse.

    Ce n'est pas readfile() qui va faire ça mais le header()
    D'accord mais je dois bien terminer par readfile (), non ?

    J'ai lu la doc de readfile sur php.net, il y a un exemple pour les PDF.

  14. #14
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Oui oui, readfile() va te permettre de récupérer le contenu du fichier.
    Mais si tu l'affiches en brut tu auras que des caractères bizarres, c'est là qu'intervient la fonction header() pour préciser le mime du fichier.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    742
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 742
    Par défaut
    Cela m'a l'air bien clair.
    Je vous enverrai ma liste de header en fin de semaine, je dois passer à autre chose pour l'isntant.

    Merci encore.

  16. #16
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    J'ai crée un dossier "factures" dans le dossier hdocs parent de www.
    Oui sa doit être bon si le root de ton serveur est www.

    Sinon un code copier de http://php.net/manual/fr/function.header.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    // Vous voulez afficher un pdf
    header('Content-type: application/pdf');
    // Il sera nommé downloaded.pdf
    header('Content-Disposition: attachment; filename="downloaded.pdf"');
    // Le source du PDF original.pdf
    readfile('../original.pdf');
    ?>
    En gros tu "trompe" le navigateur en face car tu lui dit que c'est pas une page HTML, mais un fichier pdf qui viens de demander. Après le navigateur demande les données du fichier et la tu lit l'intégralité du pdf et tu transmet directement.

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    742
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 742
    Par défaut
    Bonjour,

    Merci de ta réponse.

    J'espère faire le développement pendant le week-end.

    Dans la documentation readfile sur php.net, il y un exemple complet de la suite de header pour un PDF :

    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
     
    <?php
        public function fddAction()
        {
            // get attachment location
            $attachment_location = $_SERVER["DOCUMENT_ROOT"] . "/pdf/fdd/sample.pdf";
     
            if (file_exists($attachment_location)) {
                // attachment exists
     
                // send open/save pdf dialog to user
                header('Cache-Control: public'); // needed for i.e.
                header('Content-Type: application/pdf');
                header('Content-Disposition: attachment; filename="sample.pdf"');
                readfile($attachment_location);
                die(); // stop execution of further script because we are only outputting the pdf
     
            } else {
                die('Error: File not found.');
            }
        }
    ?>
    Je ne vois pas trop à quoi sert :

    header('Content-Disposition: attachment; filename="sample.pdf"');

    Mais a priori je suis parti pour essayer cela, sauf contre-indication de votre part.

  18. #18
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Je ne vois pas trop à quoi sert :

    header('Content-Disposition: attachment; filename="sample.pdf"');
    Ce que tu envoies au navigateur ce n'est pas le fichier mais son contenu.
    On peut donc considérer cela comme un fichier temporaire.
    sample.pdf sert donc juste à lui générer un nom.

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    742
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 742
    Par défaut
    D'accord, merci.

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    742
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 742
    Par défaut
    Bonjour,

    J'ai fait la chose et cela marche très bien sur tous navigateurs testés.

    Petit détail, la demande de téléchargement d'un client depuis depuis son compte fait l'objet d'une requête sur la BD afin de trouver le mail et le mot de passe correspondant au détenteur du document demandé.

    Le mail et le mot de passe sont comparés à ceux du compte ouvert qui sont en variables de SESSION.

    En cas d'échec, le compte est réaffiché avec un message expliquant que le document demandé n'est pas disponible.

    En cas de succès, on lance les header et readfile ().

    Merci de vos bons conseils.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/02/2007, 13h50
  2. Réponses: 7
    Dernier message: 18/03/2006, 13h16
  3. [VB]récupérer le chemin d'accès du répertoire de profile
    Par Empty_body dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 06/02/2006, 10h37
  4. Réponses: 1
    Dernier message: 30/09/2005, 21h42
  5. Chemin d'accès à un répertoire
    Par Crazyblinkgirl dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 22/08/2004, 14h39

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