[Symfony] Accès limité à un répertoire d'upload

a marqué ce sujet comme résolu.

Bonjour,

Depuis un moment déjà je cherche à corriger le problème suivant sur mon site : J’ai un espace membre sur lequel chaque membre peut avoir accès à des images. Les personnes non connectées ou les personnes qui ne sont pas liées à ces images ne doivent pas y avoir accès. Pour l’instant j’ai mis un répertoire upload dans mon répertoire web afin d’entreposer les images que j’ai uploader.

Le problème est que si un membre (ou même une personne non connectée) connait l’url d’une image, par exemple : "monsite.fr/upload/58b5347b3c7fa.png", (ou "58b5347b3c7fa" est l’uniqId générer par VichUploaderBundle, le bundle que j’utilise pour gérer l’upload de fichier) cette personne pourra voir cette image.

Ma question est donc la suivante : Suis-je obliger de placer les fichiers uploadés dans un répertoire autre que le répertoire web (exemple : app/data/upload) pour empêcher l’accès à ces images ? Et si oui comment faire pour récupérer ces images depuis ce répertoire ?

Merci d’avance pour votre temps et vos réponses :).

+0 -0

Et bien moi je le fais avec php, tu créer une page par exemple download.php et tu met en paramètre ton unique id.

Ensuite à l’aide de la fonction readfile tu peux proposer le fichier en téléchargement ou mettre le lien dans une balise <img>.

Ensuite dans le fichier php il faut faire la vérification pour savoir si l’utilisateur à le droit de voir l’image.

Fonction readfile

Utiliser le bundle VichUploader me permet de ne pas avoir a gérer l’upload, tout est fait de manière automatique. Du coup je n’ai normalement pas à gérer cette aspect.

Ma question pose plutôt sur le fait de pouvoir accéder ou non à la ressource une fois qu’elle est sur mon serveur. J’ai fait un peu plus de recherche et à ce que j’ai vu, je ne devrais pas mettre le répertoire upload dans le répertoire web qui a pour but de n’exposer que les fichiers "publique" (pas mon cas) et "statique" (mon cas : des images).

J’ai donc essayer de mettre le répertoire upload dans le répertoire app (inaccessible depuis le web), mais je n’arrive plus a accéder aux fichiers maintenant.

Edit : En fait, la situation est un peu paradoxal. D’un côté je veux que mon upload_dir soit accessible pour les utilisateurs (les fichiers présents sont des images), donc sa place est dans le répertoire web. De l’autre je veut pouvoir gérer (et empêcher si il le faut) l’accès à ces fichiers, donc sa place n’est pas dans le répertoire web qui a normalement pour but d’exposer des ressources publiques.

+0 -0

Salut !

Je n’ai jamais utilisé ce bundle, mais est-ce qu’il te persiste d’une manière ou d’une autre les informations des fichiers uploadés ?

Si oui, tu peux du coup travailler à créer un équivalent Symfony de ce que proposait WinXaito, sachant qu’avant de récupérer le fichier, tu peux tester les droits d’accès.

Si non, c’est probablement un des points qui risque de poser problème. Parce que les droits utilisateurs applicatifs sur des accès de fichiers physiques, c’est pas ce qui me semble être le plus compatible…

+0 -0

Oui il me persiste les informations des fichiers uploadés. D’abord il créer (à travers un service) un uniquId et ensuite depuis la configuration (app/config.yml) il me permet de récupérer le path du upload_dir. Je peut également rajouter des infos comme l’user lié comme attribut de l’entité Image.

Mon problème vient surtout du fait que je ne sais pas ou placer le répertoire upload.

  • Soit je place le répertoire "upload" dans le répertoire web, l’emplacement classique ou sont entreposé les fichiers publique, le problème c’est que je ne peut pas empêcher une personne qui "devinerai" l’id d’accéder à la ressource si il accède a l’url "monsite.fr/upload_dir/{idGénérerParVich}"

  • Soit je place le répertoire "upload" dans un autre répertoire comme app par exemple, mais du coup, je n’arrive pas à accéder à la ressource.

Edit : Utiliser le répertoire app est apparemment une mauvaise pratique (forum github), du coup var par exemple

+0 -0

Si vraiment tu ne veux pas qu’on tombe par hasard sur une image, il te faut le .htaccess avec la directive mentionnée par WinXaito, puis un contrôleur qui doit vérifier les droits de l’utilisateur relativement à l’image, et lire/rendre le contenu comme le ferait un script avec un bon vieux readfile(). Et ça, c’est indifférent de l’endroit où sont enregistrées les images, vu que c’est PHP qui va les y mettre et PHP qui ira les y lire.
Note que mettre tes images dans le dossier app/ est très similaire à la solution du .htaccess, vu que sauf erreur il s’y en trouve un qui ne permet pas d’accéder à ce dossier.

En fait, ce qui risque d’être le plus gourmand en ressources, c’est justement que tu dois faire un traitement Symfony pour servir des fichiers qui sont souvent servis "automatiquement"…

+0 -0

Je comprend bien ton Bundle pour l’upload mais moi j’ai parlé de download.

Je n’utilise pas symphony, mais en php "pure" c’est comme je l’ai expliqué que je le fais.

Si tu veux vérifier si un utilisateur à droit à une ressource, tu es obliger d’interdire l’accès en direct et de passer par php.

Salut,

Le lien de la doc Serving files with a controller que tu as posté fait bien le travail.

Au lieu de mettre les images dans le dossier web, tu les places dans un dossier protégé. Et tu crées une url du genre /images/:id_image qui pointe vers l’action downloadImageAction du contrôleur.

La route doit être protégée par le parefeu symfony et dans le contrôleur tu pourras tester les droits nécessaires avec d’afficher l’image.

La classe DownloadHandler qui est utilisée ne fait que streamer l’image.

Tout d’abord merci pour toutes vos réponses :). (Vous êtes bien plus calés que moi en Symfony/PHP, aussi ma réponse pourrait être pas clair et/ou pas pertinente, je vais essayer de faire au mieux.)

J’ai 2 possibilités, soit je met mon répertoire upload dans web avec un .htaccess (deny from all), soit je met ce répertoire à la racine à coté de web, app, var, …

Mon but étant depuis une zone admin, d’uplaoder des images en les associant à des utilisateurs, et coté utilisateur, je souhaite afficher la liste des images liées à cet utilisateur. Si il le souhaite, l’utilisateur peut les voir en taille réelles en cliquant sur l’image (Vich créer un lien qui pointe vers mon dossier web/upload/image/{NomImageCliqué}).

Ici, je peut alors créer une route monsite.fr/image/{id}, mais je ne peut pas lister les images dans une vue depuis une route monsite.fr/listImage.

J’ai essayer de mettre un .htaccess dans le répertoire upload (web/upload/image) avec un "Deny from all", mon problème et qu’après je ne peut plus accéder aux images.

De même j’ai essayer de créer un répertoire upload depuis la racine mais je n’arrive pas à accéder à ce répertoire pour récupérer les images.

J’ai essayer de mettre un .htaccess dans le répertoire upload (web/upload/image) avec un "Deny from all", mon problème et qu’après je ne peut plus accéder aux images.

De même j’ai essayer de créer un répertoire upload depuis la racine mais je n’arrive pas à accéder à ce répertoire pour récupérer les images.

.

Si vraiment tu ne veux pas qu’on tombe par hasard sur une image, il te faut le .htaccess avec la directive mentionnée par WinXaito, puis un contrôleur qui doit vérifier les droits de l’utilisateur relativement à l’image, et lire/rendre le contenu comme le ferait un script avec un bon vieux readfile(). Et ça, c’est indifférent de l’endroit où sont enregistrées les images, vu que c’est PHP qui va les y mettre et PHP qui ira les y lire.

Ymox

Et bien moi je le fais avec php, tu créer une page par exemple download.php et tu met en paramètre ton unique id.

Ensuite à l’aide de la fonction readfile tu peux proposer le fichier en téléchargement ou mettre le lien dans une balise <img>.

Ensuite dans le fichier php il faut faire la vérification pour savoir si l’utilisateur à le droit de voir l’image.

Fonction readfile

WinXaito

Et tu peux également voir la réponse de BestCodeur qui est plus orienté Symphony. Franchement je ne vois pas ce que tu nous demande car nous y avons déjà répondu.

J’ai pas était clair, désolé.

Comment en utilisant la fonction readfile() ou depuis "une url du genre /images/:id_image" je peut proposer une vue qui liste l’ensemble des images liés à un utilisateur.

Ces 2 méthodes ne me permettent elles pas uniquement de créer des liens de téléchargement des images ?

+0 -0

Il va y avoir deux mécanismes, là : d’une part la récupération de la liste des images d’un utilisateur, qui se fait donc dans le contrôleur, et l’affichage de celles-ci, qui se fait à travers un contrôleur (pour vérifier si l’accès est correct).

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte