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 :

[Upload] Afficher des photos en accès restreint depuis une interface admin


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 193
    Points : 68
    Points
    68
    Par défaut [Upload] Afficher des photos en accès restreint depuis une interface admin
    Bonjour,

    Je ne sais pas si cette question peut se résoudre par le php, en tout cas elle fait intervenir du php, donc voila:

    J'aimerais que des photos et autres fichiers uploadés par des visiteurs vers mon site ne soient pas accessibles aux visiteurs (car potentiellement dangereux: virus, photo choquantes, etc), mais soient accessibles depuis mon interface admin.
    Je peux mettre un .htaccess dans le repertoire ou ils se trouvent mais a chaque fois que je voudrais par exemple afficher une photo dans l'interface admin, donc pour chaque photo a chaque page, il faudra que je rentre le mot de passe, et ca rendrais le tout inutilisable tellement ca prendrait de temps!
    Si je met les fichiers dans un répertoire hors de la racine du site, il ne pourront pas etre affichés sur la page admin.

    Comment faire?

    N'y aurait-il pas par exemple le moyen de franchir le htaccess en passant le mot de passe par php?

  2. #2
    Membre éclairé Avatar de Yobs
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    675
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 675
    Points : 846
    Points
    846
    Par défaut
    Pas très bien compris mais bon je me lance.

    Si vous avez une base de donné. Il suffirait de créer une table qui stockera le chemin des image et un statut visible ou non pour les visteurs;

    Ensuite un script php qui récupère les images visibles coté visteurs et toutes les images coté administrateur.

    Sans base de donnée vous pouvez passer par un fichier xml.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 193
    Points : 68
    Points
    68
    Par défaut
    Merci Yobs pour la réponse, mais le probleme n'est pas pour uploader les fichiers.

    Une fois les fichiers dans un des répertoires du site, comment faire pour qu'ils ne soient pas accessibles aux visiteurs, mais qu'ils puissent etre affichés (si c'est des images par exp) sur une page html d'administration générée en php?

  4. #4
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par lysandre Voir le message
    Je peux mettre un .htaccess dans le repertoire ou ils se trouvent mais a chaque fois que je voudrais par exemple afficher une photo dans l'interface admin, donc pour chaque photo a chaque page, il faudra que je rentre le mot de passe, et ca rendrais le tout inutilisable tellement ca prendrait de temps!
    Non, pas pour chaque photo. En mettant les fichiers dans un sous-répertoire de la partie admin, il n'y aura aucun mot de passe à rentrer car il aura été rentré une fois pour accéder à la partie admin et il sera valable pour ce répertoire.

    Je pense qu'il s'agit là de la réponse à votre question

    Citation Envoyé par lysandre Voir le message
    Si je met les fichiers dans un répertoire hors de la racine du site, il ne pourront pas etre affichés sur la page admin.
    Effectivement.

    Citation Envoyé par lysandre Voir le message
    N'y aurait-il pas par exemple le moyen de franchir le htaccess en passant le mot de passe par php?
    Non. Le contournement possible consisterait à appeler un script PHP http://.../fichier.php?nom=xxx qui lirait le fichier xxx dans le répertoire protégé (par un quelconque moyen : un répertoire hors document root ou protégé par un Deny from all) et qui le renverrait au navigateur mais c'est franchement usine à gaz quand on voit qu'il existe une solution plus simple comme je l'évoque plus haut.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 193
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par _Mac_ Voir le message
    Non, pas pour chaque photo. En mettant les fichiers dans un sous-répertoire de la partie admin, il n'y aura aucun mot de passe à rentrer car il aura été rentré une fois pour accéder à la partie admin et il sera valable pour ce répertoire.
    Ok dc pour un meme appel de page html il ne faudra rentrer qu'une fois le code, par contre il faudra rentrer le mot de passe a chaque appel de page html?


    Citation Envoyé par _Mac_ Voir le message
    Non. Le contournement possible consisterait à appeler un script PHP http://.../fichier.php?nom=xxx qui lirait le fichier xxx dans le répertoire protégé (par un quelconque moyen : un répertoire hors document root ou protégé par un Deny from all) et qui le renverrait au navigateur mais c'est franchement usine à gaz quand on voit qu'il existe une solution plus simple comme je l'évoque plus haut.
    Le script php serait capable de lire le fichier .jpg (par exemple) mais comment pourrait-il renvoyer l'image au navigateur, je veux dire en tant qu'image affichée dans la page html?

  6. #6
    Membre éclairé Avatar de Yobs
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    675
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 675
    Points : 846
    Points
    846
    Par défaut
    En fait je voulais dire, après le stockage en bdd, il suffirez de récupérez dans la bdd les fichiers visibles pour les visiteurs en requetant sur le statu de l'image... la fatigue quant tu me tiens

  7. #7
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par lysandre Voir le message
    Ok dc pour un meme appel de page html il ne faudra rentrer qu'une fois le code, par contre il faudra rentrer le mot de passe a chaque appel de page html?
    Une seule fois par "session navigateur". Tant que vous ne fermerez pas le navigateur, vous n'aurez pas à vous réauthentifier, sauf comportement particulier du navigateur.

    Citation Envoyé par lysandre Voir le message
    Le script php serait capable de lire le fichier .jpg (par exemple) mais comment pourrait-il renvoyer l'image au navigateur, je veux dire en tant qu'image affichée dans la page html?
    En PHP, il suffit de faire un simple readfile (voir l'exemple dans la doc PHP). Il faut logiquement préciser le content type, mais si votre navigateur est malin, il pourra s'en passer. Ensuite, dans le code HTML, on fait une balise img tout ce qu'il y a de plus classique, c'est juste l'URL qui ne ressemble pas à ce qu'on voit habituellement : <img src="/fichier.php?nom=xxx">

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 193
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par _Mac_ Voir le message
    Une seule fois par "session navigateur". Tant que vous ne fermerez pas le navigateur, vous n'aurez pas à vous réauthentifier, sauf comportement particulier du navigateur.
    Ah ok. La derniere fois que j'ai essayé il me semblait qu'il me redemandait a chaque fois, mais peut-etre que j'ai revé :o) (avec navigateur firefox reglages par defaut)
    Citation Envoyé par _Mac_ Voir le message
    En PHP, il suffit de faire un simple readfile (voir l'exemple dans la doc PHP). Il faut logiquement préciser le content type, mais si votre navigateur est malin, il pourra s'en passer. Ensuite, dans le code HTML, on fait une balise img tout ce qu'il y a de plus classique, c'est juste l'URL qui ne ressemble pas à ce qu'on voit habituellement : <img src="/fichier.php?nom=xxx">
    Je viens d'essayer et c'est génial, je ne savais pas qu'il était possible d'appeller autre chose qu'un fichier image avec la balise <img>. J'aime bien cette derniere méthode, ca éviter d'avoir a s'authentifier (meme si ce n'est qu'un fois par session) et je trouve ca plus simple, je me trompes? Ou peut-etre cette méthode est plus lente ou consomme plus de ressources...?

    A propos du content-type, ou peut-on le préciser? je n'ai rien vu dans readfile, est-ce une proriété css de <img>?

    En tout cas merci pour ces réponses rapides!

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 193
    Points : 68
    Points
    68
    Par défaut
    Ah je vois deja un probleme avec la méthode fichier.php : etant donné que le fichier.php doit etre appelé par <img> il doit se trouver accessible a n'importe quel internaute, donc pour éviter que n'importe quel internaute puisse s'en servir pour voir les images hors du répertoire www il faut plutot faire qqch du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src="fichier.php?ficher=nomdufichier.jpg&code=codesecret">
    et dans fichier.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ($_GET["code"]==="codesecret") {
    readfile($_GET["fichier"]);
    } else {
    readfile("coucou.jpg");
    }
    J'aurais une autre question, imaginons qu'une pirate upload vers le site un fichier avec extension .jpg ou .png (on vérifie l'extension donc il ne pourra pas uploader autre chose). Est-il possible, si le fichier contient en fait du code php, javascript, un virus ou autre, et si le fichier est accessible depuis l'internet (donc soit dans le répertoire www, soit obtenu par la méthode précédente avec readfile) que malgré l'extension et l'affichage dans la balise <img> le code contenu dans le fichier puisse etre exécuté?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 193
    Points : 68
    Points
    68
    Par défaut
    Voila j'ai utilisé le code que j'ai donné précédemment (le codesecret n'est pas directement dans fichier.php mais dans un autrefichier.php hors du www et appelé avec include) et ca marche tres bien...pour les images.
    Par contre pour d'autre type de fichier (je n'ai bien sur pas utilisé un <img> mais un <a href>) forcément quand on clique dessus il ne propose pas le téléchargement mais affichele contenu.
    Comment faire pour qu'il proposer le téléchargement?

  11. #11
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par lysandre Voir le message
    Ah ok. La derniere fois que j'ai essayé il me semblait qu'il me redemandait a chaque fois, mais peut-etre que j'ai revé :o) (avec navigateur firefox reglages par defaut)
    Oui, j'ai déjà vu ça : je crois que Firefox redemande le mot de passe quand on a quitté le site et qu'on revient dessus, même dans la même session navigateur. Question de sécurité, j'imagine.

    Citation Envoyé par lysandre Voir le message
    A propos du content-type, ou peut-on le préciser? je n'ai rien vu dans readfile, est-ce une proriété css de <img>?
    Très simple avec l'entête HTTP Content-Type. Pour une image JPEG par exemple, tout en haut de fichier.php tu mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Content-Type: image/jpeg");
    Le truc c'est qu'il faut connaître le type de chaque image, mais tu peux facilement t'en sortir en examinant l'extension du fichier à renvoyer. Les principaux Content-Type d'images sont : image/gif, image/jpeg et image/png. Pour les autres types, voir l'ami le moteur de recherche bien connu, leader de son marché, avec les mots-clés "mime type", par exemple, la source officielle (enfin, je crois) étant le site de l'IANA.

    Citation Envoyé par lysandre Voir le message
    Ah je vois deja un probleme avec la méthode fichier.php : etant donné que le fichier.php doit etre appelé par <img> il doit se trouver accessible a n'importe quel internaute, donc pour éviter que n'importe quel internaute puisse s'en servir pour voir les images hors du répertoire www il faut plutot faire qqch du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src="fichier.php?ficher=nomdufichier.jpg&code=codesecret">
    Le souci que je vois avec cette méthode c'est que le code secret est plus ou moins invariant, le même pour tout le monde, et rien n'empêche un internaute futé d'essayer avec un autre fichier, ou plus simple, envoyer l'URL à un copain qui pourra voir l'image à son tour et éventuellement bidouiller l'URL pour voir d'autres fichiers, etc.

    Citation Envoyé par lysandre Voir le message
    Est-il possible, si le fichier contient en fait du code php, javascript, un virus ou autre, et si le fichier est accessible depuis l'internet (donc soit dans le répertoire www, soit obtenu par la méthode précédente avec readfile) que malgré l'extension et l'affichage dans la balise <img> le code contenu dans le fichier puisse etre exécuté?
    PHP, non, car sur un serveur Apache, l'interprétation du code PHP se fait sur la reconnaissance de l'extension .php du fichier. Donc tant que l'extension .php n'est pas présente, y a pas de risque. En revanche, effectivement, s'il s'agit d'un exécutable ou d'un JavaScript et que le navigateur présente une faille de sécurité, tu ne pourras pas empêcher l'exécution de code par le navigateur ou l'ordinateur de l'internaute.

    En fait 2 choses :
    • Si tu ne veux autoriser que l'upload d'images, tu peux vérifier l'extension (.png, .jpg, etc.) mais tu peux aussi utiliser la librairie GD pour ouvrir le fichier et vraiment vérifier que le fichier est une vraie image. C'est ce que j'ai fait dans un de mes développements, histoire d'être sûr justement qu'il n'y a pas tentative de piratage.
    • D'un point de vue fonctionnel, vu que pour le moment tu prévois de mettre un code secret "en dur" dans l'URL, quel en est l'intérêt ? A qui veux-tu autoriser l'accès aux images ? Mettre un code secret comme ça, sur des pages qui sont publiques, ne présente absolument aucun intérêt de mon point de vue. En revanche, si les utilisateurs sont censés s'être déjà authentifié par un formulaire Web, c'est-à-dire qu'ils ont une session, c'est très simple de mettre en place la sécurité : tu vérifies au tout début de fichier.php qu'une session existe et que l'utilisateur est bien authentifié.

  12. #12
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par lysandre Voir le message
    Par contre pour d'autre type de fichier (je n'ai bien sur pas utilisé un <img> mais un <a href>) forcément quand on clique dessus il ne propose pas le téléchargement mais affichele contenu.
    Comment faire pour qu'il proposer le téléchargement?
    Oui, c'est parce que le navigateur a identifié le Content-Type comme étant quelque chose qu'il connaît et peut afficher. Pour forcer le téléchargement, il faut mettre le Content-Type à application/octet-stream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Content-Type: application/octet-stream");

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 193
    Points : 68
    Points
    68
    Par défaut
    Ok merci encore Mac. J'ai deux remarques:

    Citation Envoyé par _Mac_ Voir le message
    Oui, c'est parce que le navigateur a identifié le Content-Type comme étant quelque chose qu'il connaît et peut afficher. Pour forcer le téléchargement, il faut mettre le Content-Type à application/octet-stream :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Content-Type: application/octet-stream");
    Avec juste ce header j'ai remarqué qu'il télécharge le fichier en question mais sous le nom de la page php, fichier.php, avec le bon contenu du fichier (mais forcément pas la bonne extension)
    J'ai trouvé en fouillant sur internet qu'il faut rajouter ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Content-Disposition: attachment; filename=".$_GET["fichier"]);

    Citation Envoyé par _Mac_ Voir le message
    Le souci que je vois avec cette méthode c'est que le code secret est plus ou moins invariant, le même pour tout le monde, et rien n'empêche un internaute futé d'essayer avec un autre fichier, ou plus simple, envoyer l'URL à un copain qui pourra voir l'image à son tour et éventuellement bidouiller l'URL pour voir d'autres fichiers, etc....

    ...D'un point de vue fonctionnel, vu que pour le moment tu prévois de mettre un code secret "en dur" dans l'URL, quel en est l'intérêt ? A qui veux-tu autoriser l'accès aux images ? Mettre un code secret comme ça, sur des pages qui sont publiques, ne présente absolument aucun intérêt de mon point de vue. En revanche, si les utilisateurs sont censés s'être déjà authentifié par un formulaire Web, c'est-à-dire qu'ils ont une session, c'est très simple de mettre en place la sécurité : tu vérifies au tout début de fichier.php qu'une session existe et que l'utilisateur est bien authentifié.
    Les fichiers seront accessibles depuis l'admin uniquement avec ce code.
    Donc le code ne sera accessible par aucun des visiteurs du site.
    La page d'admin ne retourne une page html avec les liens "fichier.php?code=moncode&fichier=nomdefichier.extension" que si la personne s'est correctement authentifiée sur l'admin.
    Donc seuls les administrateurs connaitrons ce code. Apres a moi de bien choisir mes administrateur ;o)

  14. #14
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par lysandre Voir le message
    Donc seuls les administrateurs connaitrons ce code. Apres a moi de bien choisir mes administrateur ;o)
    On est d'accord L'intérêt toutefois de vérifier la session (si tu fais une authentification Web par session) c'est qu'un copier-coller direct d'une URL de téléchargement ne marchera pas, il faudra s'authentifier. En fait, le pb c'est pas tant que les URL n'apparaissent que sur une page protégée, c'est que les URL soient elles-mêmes protégées, que quand tu les demandes, on vérifie ton authentification.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 193
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par _Mac_ Voir le message
    On est d'accord L'intérêt toutefois de vérifier la session (si tu fais une authentification Web par session) c'est qu'un copier-coller direct d'une URL de téléchargement ne marchera pas, il faudra s'authentifier. En fait, le pb c'est pas tant que les URL n'apparaissent que sur une page protégée, c'est que les URL soient elles-mêmes protégées, que quand tu les demandes, on vérifie ton authentification.
    Oui dans l'idéal c'est le mieux, dans le cas ou il y aurait une fuite involontaire de la part d'un administrateur. Mais je pense que ca ralentira pas mal le chargement des pages si a chaque fois qu'une image est chargée (disons qu'il y en ait 20 par page, le nombre de fichiers peut grimper tres vite si on a des formules dans un texte sauvegardées en .png) on se connecte a la bdd pour authentifier l'utilisateur (pour l'admin je ne marche pas par session, j'ai choisi un systeme qui vérifie dans une bdd et renouvelle l'equivalent de l'identifiant session a chaque chargement de page)

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

Discussions similaires

  1. Afficher des photos dans une Bdd
    Par tleboukaka dans le forum EDI
    Réponses: 1
    Dernier message: 23/12/2009, 10h53
  2. Specification de la forme ou on veut afficher des photos
    Par mihaispr dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 01/04/2009, 08h35
  3. [AJAX] Afficher des photo avec AJAX
    Par pierrot10 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/08/2007, 08h34
  4. afficher des photos differentes sur un site
    Par 18Marie dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 10/08/2006, 10h39
  5. afficher des photos dans un état.
    Par jeck dans le forum IHM
    Réponses: 4
    Dernier message: 02/06/2006, 15h19

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