France Hardware : Forums de discussion - Découvrez notre nouveau comparateur d'offres Internet
Retrouvez les prix près de chez vous :  
Index du forum | Liste des membres | Liste des groupes | Inscription | F-A-Q | Recherche
Pseudo :    Password :     
29 511 membres enregistrés - 2 069 318 posts - 122 026 topics
Index des forums FH  | Index des forums DegroupNews
      Programmation
           Langages Web
                comment peut t\'on interdire ou de lire un fichiers ?
60 connectés(record : 2799 le 29 May 2016 - 15 h 34)

Vous devez vous connecter pour répondre au topic.
1,2 | Suivant
comment peut t\'on interdire ou de lire un fichiers ?

keo
symfony2

Messages : 3 031
Inscrit le 08/11/02
Non connecté
  Posté le 09 November 2011 - 14 h 18 m 03 s
Bonjour,

je recherche un moyen de lire ou d'interdire l'accès à un fichier image, document, archive ...

voici mon souci:

On me demande que des professeurs puissent déposer des documentations pour partager envers ces élèves et aussi ces collèges

- le prof ne veut pas mettre à disposition le document qu'il a fait à tous le monde

- le prof doit pouvoir choisir quel personne a le doit de lire son document , la personne est bien sur inscrit sur le site.

- le prof a améliorer sa documentation est il souhait garder son ancienne version et déposer le nouveau avec le nouveau nom.

j'avais penser à ce system mais je ne sais pas si c'est faisable:
imaginons que le prof dépose un image visible.jpg

- je récupère le nom de visible.jpg

- je renomme avec aléatoire par exemple DGRDCF.inconnu , comme ça on ne sais pas que veut dire ce fichier et quelle extension en plus, puis ce fichier est déposer dans un dossier

- ce nom inexploitable je l'enregistre dans ma bdd et je dis que DGRDCF.inconnu = visible.jpg

- lorsque php rencontre par exemple l'extension .inconnu, il va rechercher le nom qui correspond a cette chaine de caractère.

- un fois trouver il va récupérer une session user par exemple

- si l'id user de la base de donnée correspond à l'id session alors on affiche
visible.php

sinon on met un message qu'il ne peut pas le visualiser dans le cas d'une image , ou l'interdire dans le cas d'un fichier à uploader.

si quelqu'un a une idée , je remercie d'avance pour la réponse


Message édité 1 fois, la dernière par keo le 09 November 2011 - 14 h 18.

java

fouineur
Modérateur
Avatariste fou

Messages : 5 994
Inscrit le 26/09/04
Non connecté
  Posté le 09 November 2011 - 14 h 24 m 03 s
Suggestion d'un béotien qui n'y connait rien:
Et si tu faisais des sous répertoire ?

Tu crées un répertoire "virtuel" qui renvoie les contenus d'un ou plusieurs sous-répertoires en fonction des droits d'accès de l'utilisateur.




Woofy
Totalement inutile, complètement indispensable

Messages : 31 539
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 09 November 2011 - 14 h 30 m 01 s
Sinon, tu dépose les fichiers et dossiers dans un répertoire inaccessible au serveur web (afin que le navigateur ne puisse pas aller le chercher directement), et tu peut faire un script php qui, via la fonction passthru, va lire le fichier et le fournir au navigateur lors de la demande de téléchargement. Ce script pourra alors vérifier l'identité de la personne qui demande à télécharger le fichier et voir si elle en a les droits ou pas.

Il faudra envoyer un type mime application/octets-stream ou quelque chose dans le genre.

Sinon ton système est faisable, mais c'est assez moyen je trouve et pas aussi sécurisé que ce que je te propose.


Message édité 1 fois, la dernière par Woofy le 09 November 2011 - 14 h 30.


keo
symfony2

Messages : 3 031
Inscrit le 08/11/02
Non connecté
  Posté le 10 November 2011 - 09 h 21 m 40 s
merci de vos réponse

j'ai trouver ceci comme logiciel mais c'est dommage il ne permet pas de donner des droits a un collègue d'ouvrir le dossier, c'est seulement chaque compte à le droit de lire/écrire/modifier c'est tout.

http://exploreboard.free.fr/

avec php comment fait t'on pour crée un dossier virtuel et lui mettre des droits dans un fichiers ?
Le seul moyen que je connais pour mettre un mot de passe sur un dossier ou un fichier c'est le htacess.
Mais je ne vais pas tout de même à chaque nouveau utilsateur , chaque nouvelle règle , chaque changement crée un .htacess ?

merci woofy :)
    Code     
1. et tu peut faire un script php qui, via la fonction passthru, va lire le fichier et le fournir au navigateur lors de la demande de téléchargement. Ce script pourra alors vérifier l'identité de la personne qui demande à télécharger le fichier et voir si elle en a les droits ou pas.


si je fait ceci, et que par exemple un prof par hasard arrive a trouver le lien du document interdit, il pourra le télécharger ?

sur le campus il utilise hive

http://www.learnexact.com/en/products/harvestroad-hive-digital-repository
ce logiciel est sous tomcat/jsp

peut être que j'ai plus de chance de trouver un opensource avec java ? si c'était le cas il me serai difficile de faire le pont entre php(le e-learning) et java.


Message édité 2 fois, la dernière par keo le 10 November 2011 - 09 h 26.

java

Woofy
Totalement inutile, complètement indispensable

Messages : 31 539
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 10 November 2011 - 10 h 04 m 01 s
Ben s'il trouve le lien du document interdit, ça sera un lien vers la page php avec un identifiant.
Derrière, tu fais quelque chose qui vérifie si celui qui demande le téléchargement est connecté à ton site (session, ...), et si oui, tu vérifie si la personne à les droits d'accès au fichier (que tu stocke en base de donnée).
Il n'y a pas de lien direct vers le fichier, puisque le fichier est dans un répertoire hors de la portée du serveur web (mais pas de php).

Exemple : si ton serveur web travaille dans /var/www/, avec plusieurs sites pourquoi pas (par exemple site1 dans /var/www/site1 et site2 dans /var/www/site2) mais qu'aucun hôte ne tape directement dans /var/www, tu peux mettre tes fichiers dans /var/www/fichiers, voir dans /var/fichiers.

Dans ce cas, impossible de faire un lien vers le site, vu que toutes les url entrées par les utilisateurs, pour n'importe quel sites, iront dans /var/www/site1 ou /var/www/site2, mais jamais dans /var/www/fichiers.

Hive, je ne connais pas.

Pour info, le code d'envoi du fichier ressemble à ça (je l'ai fait en readfile, mais c'est le même genre).
    Code php    
1. $file=<chemin absolu vers le fichier vu du serveur>
2. header("Content-type: application/octet-stream");
3. header("Content-Disposition: attachment; filename=fichier.pdf");
4. readfile($file);




Woofy
Totalement inutile, complètement indispensable

Messages : 31 539
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 10 November 2011 - 10 h 11 m 38 s
Après c'est à toi de jouer.
Tu peux faire un truc dans le genre :
    Code php    
 1. <?php
 2. <vérification de la connexion>
 3. if (<vérification de la connexion> = ok)
 4. {
 5.     <vérification des droits sur le fichier>
 6.     if (<vérification des droits sur le fichier> = ok)
 7.     {
 8.         // téléchargement du fichier
 9.         $file=<chemin absolu vers le fichier vu du serveur>
10.         header("Content-type: application/octet-stream");
11.         header("Content-Disposition: attachment; filename=fichier.pdf");
12.         readfile($file);
13.     }
14.     else
15.    {
16.         // pas le droit de télécharger le fichier
17.         ?>
18.         <html>
19.            <head><titre></titre></head>
20.            <body>
21.               <h1>Droits insuffisants</h1>
22.               <p>Vous n'avez pas les droits de télécharger ce fichier.<br />
23.                <a href="lien vers la page précédente.php">Revenir en arrière</a></p>
24.           </body>
25.         </html>
26.         <?php
27.     }
28. }
29. // L'utilisateur n'est pas connecté
30. header('Location: http://www.example.com/accueil.php');
31. ?>




keo
symfony2

Messages : 3 031
Inscrit le 08/11/02
Non connecté
  Posté le 10 November 2011 - 11 h 21 m 08 s
merci woofy j'ai test cela,
je pense que cela fonctionne ,
comme je suis sous windows, je ne sais pas si j'ai bien fait les choses correctement
, j'ai donc mon arborescence de fichier

c:/wamp
c:/wamp/interdit.txt
c:/wamp/www/lire.php // le script en question


    Code     
 1. <?php
 2. //vérfier la connextion
 3. $fichier="interdit.txt";
 4. $verif="ok-";
 5. if($verif=="ok")
 6. {
 7. $fichier ="interdit.txt"; //on récupére par exemple le nom d'un fichier dans la  bdd
 8. $url ="c:/wamp/";
 9. header("Content-type: application/octet-stream");
10. header("Content-Disposition: attachment; filename='$fichier'");
11. readfile($url);
12. }
13. else
14. {
15. ?>
16.        <html>
17.            <head><titre></titre></head>
18.             <body>
19.                <h1>Droits insuffisants</h1>
20.              <p>Vous n'avez pas les droits de télécharger ce fichier.<br />
21.                <a href="#">Revenir en arrière</a></p>
22.          </body>
23.        </html>
24.        <?php
25.     }
26. 
27. ?>

Si j'était sur un serveur LAMP, quelle serai les permission a mettre pour le dossier wamp ?
on peut par exemple au lieu de télécharger un fichier on affiche une image ?
avec php sera t'il simple de déposer un fichier qui se trouver hors www ?


Message édité 3 fois, la dernière par keo le 10 November 2011 - 11 h 49.

java

Woofy
Totalement inutile, complètement indispensable

Messages : 31 539
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 10 November 2011 - 12 h 13 m 09 s
Tu peux afficher une image, il suffit de modifier les header.
Pour le reste, je ne sais pas, mais ne pense-tu pas que je t'ai pas mal maché le travail là ? ;)
Pour les droits, je pense que ça doit être du 750 pour les dossiers et 640 pour les fichiers si tu met en groupe le groupe de ton utilisateur apache, et comme propriétaire root par exemple, sinon si tu met en propriétaire l'utilisateur apache tu peux même faire 700 et 600.
Pour déposer un fichier, ben c'est pareil, le navigateur n'a pas les droits, mais PHP si.




keo
symfony2

Messages : 3 031
Inscrit le 08/11/02
Non connecté
  Posté le 10 November 2011 - 13 h 45 m 55 s
oui tu m'a bien aider :)

, je vais essayer de développer mon application avec ta solution et crée la base de donnée qui va avec.

merci encore :)






java

keo
symfony2

Messages : 3 031
Inscrit le 08/11/02
Non connecté
  Posté le 10 November 2011 - 13 h 46 m 39 s
oui tu m'a bien aider :)

, je vais essayer de développer mon application avec ta solution et crée la base de donnée qui va avec.

merci encore :)






java

grabber
Coordinateur
MacBook Pro Powered

Messages : 9 506
Inscrit le 06/03/02
Ville : Angers
Non connecté
  Posté le 10 November 2011 - 21 h 02 m 16 s
alors !!! ça bosse dur !!!

j'ai lu vite fait, je vois que t'es en plein dans le code keo :) alors... heureuse :lol:
bon blague à part, j'ai pas trop compris l'histoire de l'upload avec changement de nom etc etc...
j'aurais un peu fait différemment :
- lors de l'upload, on met le fichier dans un dossier de stockage quel qu'il soit, si possible en dehors du /www/ (ou /public_html/ ou autre...). je conseille avant de stocker bêtement d'ajouter un timestamp dans le nom du fichier, genre : timestamp_nom-du-fichier, cela ne détériore pas le nom réel du fichier, il suffit pour le réafficher dans un backoffice de supprimer les 1ers caractères correspondant au timestamp, donc ultra facilement gérable avec une mini fonction d'une ligne (substr ou preg_replace) :) bref. si le dossier de stockage est accessible depuis le web (donc dans le www ou public-html), un deny from all dans le htaccess fera très bien l'affaire, il est la pour ça !
donc en résumé on stocke tout au même endroit, bien sur à l'insertion, on enregistre le fichier dans la base avec les groupes d'utilisateurs (ou les noms...) qui sont autorisés. bien sur toujours, chaque fichier a un id unique, on pourrait penser que c'est con car il y a le timestamp, mais si dans le même centième bla bla, donc bref, un id, c'est aussi fait pour çà.

côté utilisateur :
le gars essaye de télécharger, même avec le chemin absolu, le deny va le jeter, s'il a une adresse du type telecharger.php?id=114, alors on va dans la base on regarde qui a le droit au 114 et si le type a le droit. oui ou non (une ptite fonction...), si oui on reprend la méthode de woofy pour le téléchargement du fichier.

voila, en gros je me ferais pas chier a créer des dossiers, gérer des droits, etc etc. ça règle pas mal de problèmes de reconstitution de chemin, de régénération du nom réel après le readfile etc etc.
faut faire confiance a apache, les deny sont efficaces.

quand au problème de versioning d'un même fichier, il n'est plus actuel dans le sens ou le timestamp sera toujours différent, donc les fichiers seront distincts, on garde tout l'historique. pour reconstituer le versioning au complet en affichage, 2 méthodes, soit on récup les fichiers du nom concerné classés par timestamp (mini fonction inside, la même que l'autre mais on récup le début au lieu de la fin) et on décode le timestamp via la fonction date(), soit on va jouer avec la base et on récup la date d'upload qu'on aura préalablement intégrée dans la base.
perso je préfère la méthode timestamp, faire des requêtes pour faire des requêtes ça sert a rien). j'utilise TOUJOURS les timestamp sur les uploads, c'est très pratique, des fois ça sert a rein mais cela évite les doublons, et des fois ça peut nettement plus servir.

voila vite fait en travers comment j'aurais vu le truc, j'ai rien teste, je dis ça après une bonne lecture en travers :) je suis soufflé par tant de participation dans ce forum !!!!!! on explose les records de la section prog !!!!!!!

bonne soirée ;)




:firefox: :ol:

Woofy
Totalement inutile, complètement indispensable

Messages : 31 539
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 10 November 2011 - 22 h 52 m 33 s
Après si tu veux faire du versionning, tu tente de synchroniser le truc avec un SVN. Bon courage ! :P
Ou alors tu installe un Sharepoint.




grabber
Coordinateur
MacBook Pro Powered

Messages : 9 506
Inscrit le 06/03/02
Ville : Angers
Non connecté
  Posté le 10 November 2011 - 22 h 54 m 35 s
ouais enfin là t'installes rien du tout :) c'est pratique quand même :)
d'après ce que j'ai lu, il veut garder les versions, pas forcément faire un vrai versionning, surtout que gérer en plus un svn et l'attaquer en php il a pas fini d'être bien occupé :lol:



:firefox: :ol:

keo
symfony2

Messages : 3 031
Inscrit le 08/11/02
Non connecté
  Posté le 13 November 2011 - 13 h 04 m 25 s
merci encore de ta réponse oliv :)

je vais essayer si j'arrive tous ce que tu me dit mais avant, je dois essayer de récupérer
les login et mots de passe pour savoir qui a déposer le fichier.

Quelqu'un à déjà utiliser un LDAP pour la connexion?? est -ce simple de l'utiliser?





Message édité 1 fois, la dernière par keo le 13 November 2011 - 13 h 07.

java

grabber
Coordinateur
MacBook Pro Powered

Messages : 9 506
Inscrit le 06/03/02
Ville : Angers
Non connecté
  Posté le 13 November 2011 - 14 h 17 m 07 s
pas fait mais pas compliqué avec pear :jap:

http://pear.php.net/manual/fr/package.authentication.auth.storage.ldap.php

qui a déposé le fichier ? c'est un truc que tu devrais rentrer dans ta base lors de l'upload ;) ou tu peux compliquer un peu le renommage du fichier en ajoutant l'id de l'uploader, genre :
xxxxxxxxxx_y_aaaaaaaaaaa.extension
ou xxxx est le timestamp, y l'id et aaaa le nom normal du fichier. ça t'évite ainsi de passer par la base, mais comme de toute façon tu y passeras alors je pense pas que cela apporte grand chose.



:firefox: :ol:

keo
symfony2

Messages : 3 031
Inscrit le 08/11/02
Non connecté
  Posté le 16 November 2011 - 09 h 45 m 31 s
merci :),

je vais finalement laisser tomber cette solution, car je viens de voir que l'application ne fait pas que de déposer de fichier, il y a plein d'autre fonction, je ne vais pas m'amuser a crée un logiciel.

j'ai un autre souci:

je doit refaire un menu déroulant, et pour cela je dois rechercher vis la bdd les url qui pointe sur les cours
voici en gros ce que je doit récupérer.

    Code     
1. racineserveur/categorie=?le_numéro_de_lesson
le numéro catégorie est dans un champ appellé path qui est est sous cette forme: 12/959/4545 pour trouver le numéro de lesson, je doit juste récupérer 4545 par exemple, le reste ne me sert pas. voici ce que j'ai trouver comme script, par des regex, peut être que tu a plus simple ?
    Code     
 1. $path="/15/114/4545"; //l'url qui correspond a sa lecon qui permet de compléter l'url  de 1 à l'infine
 2. 
 3. $nb_caractere = strlen($path);
 4. $pattern="#^/#";
 5. 
 6. for($i=1; $i <$nb_caractere; $i++)
 7. {
 8. $resultat = substr($path,-$i);
 9. echo $resultat;
10. 	if(preg_match($pattern,$resultat))
11. 	{
12. 		echo "<h1>presence slash</h1>";
13. 		$trouver= $resultat;
14. 		break;
15. 	}
16. echo $i;
17. }
18. $num_lesson=str_replace("/","",$resultat);
19. echo "<h1>$num_lesson</h1>";
20. 
21. echo strlen($num_lesson);


ici je suis arrivé a récupérer les derniers chiffre sans le slash, je pense qu'on doit pourvoir faire plus simple non?


Message édité 1 fois, la dernière par keo le 16 November 2011 - 09 h 46.

java

grabber
Coordinateur
MacBook Pro Powered

Messages : 9 506
Inscrit le 06/03/02
Ville : Angers
Non connecté
  Posté le 16 November 2011 - 19 h 09 m 51 s
    Code     
1. $temp=explode('/', $path);
2. $chaine_recherchee=$temp[2];


:jap:



:firefox: :ol:

grabber
Coordinateur
MacBook Pro Powered

Messages : 9 506
Inscrit le 06/03/02
Ville : Angers
Non connecté
  Posté le 16 November 2011 - 19 h 12 m 33 s
ou si le chemin peut comporter plusieurs /, alors tu modifies juste un peu pour recup la derniere partie.

    Code     
1. $temp=explode('/', $path);
2. if (is_array($temp) && sizeof($temp)>0) {
3.   $chaine_recherchee=$temp[sizeof($temp)-1];
4. }


voila :)


Message édité 1 fois, la dernière par grabber le 16 November 2011 - 19 h 12.

:firefox: :ol:

Erel69
- Ancien Modérateur -
Fantôme
Officiel

Messages : 19 554
Inscrit le 07/11/01
Ville : Lyon
Non connecté
  Posté le 16 November 2011 - 22 h 38 m 23 s
grabber, pour info la fonction explode retourne toujours un tableau du moment que tu lui passes un délimiteur, donc ton test est superflu ;)

donc pour récupérer la dernière partie, un simple
$chaine = end(explode('/',$path));
suffira :)

ou un
$chaine = basename($path);
fera aussi l'affaire




keo
symfony2

Messages : 3 031
Inscrit le 08/11/02
Non connecté
  Posté le 17 November 2011 - 12 h 49 m 39 s
merci grabber,
merci beaucoup erel, c'est vraiment pratique et rapide,efficace
    Code     
1. $chaine = basename($path);
:jap: celle ci elle fonctionne très bien toutes seul par contre pour l'autre solution je l'ai mis dans une fonctionne à l'intérieur d'une boucle
    Code     
1. 				public function getUrl($path)
2. 				{
3. $chaine = end(explode('/',$path));
4. 				echo $chaine;
5. 				
6. 
7. 
8. 				}
et cela fait des erreurs
    Code     
1. Strict Standards: Only variables should be passed by reference in

je n'avais encore jamais vu cette erreur


Message édité 3 fois, la dernière par keo le 17 November 2011 - 13 h 06.

java

1,2 | Suivant
Page genérée en 0.4317 secondes par RahForum 2.0 | Gzip off |  Stats |  Metaforums |  RSS
© 2004 Cerbere Systems.
Prix Matériel Informatique | Informatique Lyon | Informatique Grenoble | Informatique Annecy | Informatique Marseille | Informatique Bordeaux | Forum Informatique
ADSL | Actualité ADSL | Deligo | Appareil photo | Commande Au Volant
Creative Commons
Message Boards and Forums Directory