[PHP]Autoriser l'accés à un fichier pendant un temps précis ?

Autoriser l'accés à un fichier pendant un temps précis ? [PHP] - PHP - Programmation

Marsh Posté le 07-01-2004 à 20:18:05    

Bonjour,
 
Je cherche à autiriser l'acces à une fichier sur mon serveur mais pendant un certain temps. Ce temps correspond au temps de téléchargement du fichier.  
En gros je voudrais que des que la personne a télécharger ce fichier, il ne puisse plus y acceder par la suite.
Genre je lui donne un accés pour telecharger un certain fichier, il le télécharge et une fois le download fini, je lui retire son accés.
 
Est ce que tout cela est possible (mettre un acces automatique a ce fichier en php et l'enlever une fois ce fichier télécharger)?
 
Marchi  :hello:


Message édité par Phive le 07-01-2004 à 20:19:23

---------------
/!\ Post powered by Phive-online.com /!\
Reply

Marsh Posté le 07-01-2004 à 20:18:05   

Reply

Marsh Posté le 07-01-2004 à 22:04:57    

Je pense que tu pourrais passer par un script php auquel tu fournis en argument le nom du fichier. Il vérifie que l'utilisateur peut le télécharger, et il lui envoie directement le contenu avec les headers nécéssaires pour le client comprenne qu'il télécharge un fichier.

Reply

Marsh Posté le 08-01-2004 à 23:38:37    

Merci bien pour ton idée mais j'ai encore du mal a saisir le fonctionnement de ce "script"


---------------
/!\ Post powered by Phive-online.com /!\
Reply

Marsh Posté le 09-01-2004 à 10:02:53    

Phive a écrit :

Merci bien pour ton idée mais j'ai encore du mal a saisir le fonctionnement de ce "script"


Heu En fait c'est une mauvaise idée car souvent PHP a une durée limitée d'exécution alors si le fichier est trop gros, l'utilisateur n'aura jamais son fichier.

Reply

Marsh Posté le 09-01-2004 à 11:08:29    

Script de redirection pour planquer l'adresse du fichier, et vérification de l'IP/ID Session ?


---------------
Faux & usage de faux ¤ Machins roses ¤ ASCIImage ¤ HFR Enhance v0.8.6
Reply

Marsh Posté le 09-01-2004 à 11:49:59    

> Tentacle : c'est pourtant à mon avis le seul moyen de controler le début et la fin du téléchargement.
 
Peut être en découpant le fichier en petit bout et en exécutant le script successivement sur ces petits bouts...

Reply

Marsh Posté le 09-01-2004 à 12:07:26    

Freekill a écrit :

Script de redirection pour planquer l'adresse du fichier, et vérification de l'IP/ID Session ?


 
Oui mais ce qui me gène dans cette technique, c'est que si le script redirige le client pour qu'il puisse telecharger le fichier ... alors il y a toujours moyen d'avoir l'adresse du fichier qu'on telecharge, et donc de renouveler le download une autre fois ... non ?
 

Citation :

> Tentacle : c'est pourtant à mon avis le seul moyen de controler le début et la fin du téléchargement.


Peut-être mais même si on découpe le fichier, on n'est pas garantie de la vitesse de download du client.
... Il y a peut-être la solution d'un copie temporaire du fichier sous un nom bizarre (style md5 pour que quelqu'un d'autre ne puisse pas trouver le fichier au pif) et laisser un temps limite pour le telechargement puis l'effacer. Problème : faut pouvoir effacer le fichier au bout de ce temps et puis c'est pas très performant de faire des copies partout :/

Reply

Marsh Posté le 09-01-2004 à 12:10:57    

Bah en tout cas marchi bien pour ces petites idées que vous m'avez donner.
je vais tenter de réaliser cela.
 
Sinon il me semblait que php avait des fonction reseaux qui permettaient de tester les données envoyer et recu. Est ce vrai ?
 
Sinon Freekill merci pour ton idée et c'est ce que j'avais prevu de faire sauf que maintenant le probleme c'est de savoir si le fichier à bien était télécharger complétement par le user


---------------
/!\ Post powered by Phive-online.com /!\
Reply

Marsh Posté le 09-01-2004 à 12:19:00    

Tiens une idée bizarre qui me vient soudainement : ne pourrait-on pas utiliser php pour (ré)générer un .htaccess contenant les IP autorisées à télécharger le fichier ?


---------------
Faux & usage de faux ¤ Machins roses ¤ ASCIImage ¤ HFR Enhance v0.8.6
Reply

Marsh Posté le 09-01-2004 à 12:28:19    

J'y avais penser :)
Je pense que cela est bien possible car avec php on peut creer un fichier txt par exemple et apres simple le renomer .htaccess
C'est une idée.. Je note !  
Marci :)


---------------
/!\ Post powered by Phive-online.com /!\
Reply

Marsh Posté le 09-01-2004 à 12:28:19   

Reply

Marsh Posté le 09-01-2004 à 12:31:37    

Phive a écrit :

J'y avais penser :)
Je pense que cela est bien possible car avec php on peut creer un fichier txt par exemple et apres simple le renomer .htaccess
C'est une idée.. Je note !  
Marci :)


 
Oui mais reste le problème qu'a la fin du telechargement il faut que le fichier ne soit plus telechargeable ... or un script php ne pourra pas rester en exécution tout ce temps et il n'y a pas moyen de lancer un script au bout d'un certain temps :/
Ou peut-être compter sur une grosse fréquentation de ton site pour mettre a jour les droits mais bof

Reply

Marsh Posté le 09-01-2004 à 12:50:12    

Tentacle a écrit :


 
Oui mais reste le problème qu'a la fin du telechargement il faut que le fichier ne soit plus telechargeable ... or un script php ne pourra pas rester en exécution tout ce temps et il n'y a pas moyen de lancer un script au bout d'un certain temps :/
Ou peut-être compter sur une grosse fréquentation de ton site pour mettre a jour les droits mais bof  


 
Oui c'est tjs le même problème.
 
Sinon tu entends koi par ta dernier phrase : changer les droits ok mais pkoi une grosse fréquentation ?


---------------
/!\ Post powered by Phive-online.com /!\
Reply

Marsh Posté le 09-01-2004 à 12:58:05    

une grosse fréquentation te permet de lancer fréquemment la mise à jour des droits ... c'est les utilisateurs qui génèrent une action sur ton site ...

Reply

Marsh Posté le 09-01-2004 à 13:00:00    

ha oki  
don pour le moment je suis un peu bloker concernant le test de fin de teléchargement...
Faudrait peut etre trouver un autre systeme...


---------------
/!\ Post powered by Phive-online.com /!\
Reply

Marsh Posté le 09-01-2004 à 13:19:13    

Ya pas moyen de modifier localement la configuration de PHP pour enlever cette foutu limitation de temps d'éxécution ... juste pour un script de téléchargement ?

Reply

Marsh Posté le 09-01-2004 à 13:39:16    

Bah en local je pense ke oui mais une fois sur le serveur de mon hebergeur je ne pourrais modifier ce paramettre...
donc bon :/
 
ralala je sens ke ca va etre dur...


---------------
/!\ Post powered by Phive-online.com /!\
Reply

Marsh Posté le 09-01-2004 à 15:07:22    

En fait si c'est possible avec ini_set()
ini_set(max_execution_time,30)
au lieu de 30 tu met un chiffre qui correspond à la durée approximative du téléchargement ou en tout cas une limite max.
 
Et ça n'impacte que le script en cours !
 
Ensuite tu peux gerer la connection de l'utilisateur avec connection_aborted() dans le script appelant. Enfin là tu as le choix de la méthode ....


Message édité par Azzazel le 09-01-2004 à 15:26:26
Reply

Marsh Posté le 09-01-2004 à 17:43:00    

Azzazel a écrit :

En fait si c'est possible avec ini_set()
ini_set(max_execution_time,30)
au lieu de 30 tu met un chiffre qui correspond à la durée approximative du téléchargement ou en tout cas une limite max.


 
En priant pour que la config de PHP chez l'hébergeur le permette  :sweat:

Reply

Marsh Posté le 09-01-2004 à 18:10:17    

Oui en local cela ne posera pas de probleme mais chez mon hebergeur (OVH) je ne sais pas pas...faudrait que je demande
 
Mais encore merci bcp pour votre aide


---------------
/!\ Post powered by Phive-online.com /!\
Reply

Marsh Posté le 10-01-2004 à 15:04:11    

Tiens à propos du script php pour télécharger un fichier, j'ai trouvé un exemple dans les commentaires de la doc PHP sur www.php.net. Voivi le lien (commentaire du 5 janvier 2004) et voici le bout de code :
 

Code :
  1. <?
  2. $filename = $_GET['file'];
  3. $ext = substr( $filename,-3 );
  4. if( $filename == "" ) {
  5.    echo "<html><body>ERROR: Empty file to download. USE download.php?file=[file path]</body></html>";
  6.    exit;
  7. } elseif ( ! file_exists( $filename ) ) {
  8.    echo "<html><body>ERROR: File not found. USE download.php?file=[file path]</body></html>";
  9.    exit;
  10. };
  11. switch( $ext ){
  12.    case "pdf": $ctype="application/pdf";              break;
  13.    case "exe": $ctype="application/octet-stream";      break;
  14.    case "zip": $ctype="application/zip";              break;
  15.    case "doc": $ctype="application/msword";            break;
  16.    case "xls": $ctype="application/vnd.ms-excel";      break;
  17.    case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
  18.    case "gif": $ctype="image/gif";                    break;
  19.    case "png": $ctype="image/png";                    break;
  20.    case "jpg": $ctype="image/jpg";                    break;
  21.    default:    $ctype="application/force-download";
  22. }
  23. header("Pragma: public" );
  24. header("Expires: 0" );
  25. header("Cache-Control: must-revalidate, post-check=0, pre-check=0" );
  26. header("Content-Type: $ctype" );
  27. $user_agent = strtolower ($_SERVER["HTTP_USER_AGENT"]);
  28. if ((is_integer (strpos($user_agent, "msie" ))) && (is_integer (strpos($user_agent, "win" )))) {
  29.    header( "Content-Disposition: filename=".basename($filename).";" );
  30. } else {
  31.    header( "Content-Disposition: attachment; filename=".basename($filename).";" );
  32. }
  33. header("Content-Transfer-Encoding: binary" );
  34. header("Content-Length: ".filesize($filename));
  35. readfile("$filename" );
  36. exit();
  37. ?>


 
Comme tu vois, il faut connaître le type MIME en fonction de l'extension du fichier (doit bien y avoir un moyen de récupérer ça autrement vu que Apache le connaît ?). Ce que j'ai trouvé bien, c'est le fait de pouvoir spécifier le nom sous lequel le fichier devra être enregistré (par défaut) chez le client, c'est à dire la ligne :

Code :
  1. header( "Content-Disposition: attachment; filename=".basename($filename).";" );


Voir ici pour une description du header.  :jap:  
 
Reste à vérifier si ton hébergeur accepte le fait de pouvoir modifier localement la durée de vie d'un script.

Reply

Marsh Posté le 10-01-2004 à 17:02:06    

Tentacle > ce genre de script est bon pour se faire hacker s'il est pas un minimum customisé...
 
imagine que je lance download.php?file=config.php, je récupère ton fichier de configuration (on peut facilmeent supposer que ce soit celui qui contienne les login/pwd d'accès à la DB).
N'importe quel fichier php est téléchargeable en clair...
 
La meilleur méthode est :
- stockage dans une DB des noms des fichiers (par exemple, ou dans un fichier text/php)
- protection par un .htaccess à tout accès au répertoire contenant les fichiers. (pour être sûr qu'un petit malin ne s'amuse pas à downloader le fichier directement)
- la demande de download d'un fichier se fait par un lien du genre download.php?id=1
- Vérifier que la  personne (authentifiée par session) ait le droit de downloader ce fichier.
  - La correspondance avec le nom est faite par une query SQL.
  - Le droit ou nom de télécharger ce fichier est aussi stocké dans une table (stockage de l'heure autorisée + durée).
- si ok, utiliser le script de Tentacle, sinon teletubies
 

Code :
  1. $filename= sql->query->("select nom from file where id=$id" ).
  2. $ext= substr( $filename, strrpos($filename, '.') );
  3. switch( $ext ){
  4.        case "pdf": $ctype="application/pdf";              break;
  5.        case "exe": $ctype="application/octet-stream";      break;
  6.        case "zip": $ctype="application/zip";              break;
  7.        case "doc": $ctype="application/msword";            break;
  8.        case "xls": $ctype="application/vnd.ms-excel";      break;
  9.        case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
  10.        case "gif": $ctype="image/gif";                    break;
  11.        case "png": $ctype="image/png";                    break;
  12.        case "jpg": $ctype="image/jpg";                    break;
  13.        default:    $ctype="application/force-download";
  14.   }
  15.   header("Pragma: public" );
  16.   header("Expires: 0" );
  17.   header("Cache-Control: must-revalidate, post-check=0, pre-check=0" );
  18.   header("Content-Type: $ctype" );
  19.   $user_agent = strtolower ($_SERVER["HTTP_USER_AGENT"]);
  20.   if ((is_integer (strpos($user_agent, "msie" ))) && (is_integer (strpos($user_agent, "win" )))) {
  21.        header( "Content-Disposition: filename=".basename($filename).";" );
  22.     } else {
  23.        header( "Content-Disposition: attachment; filename=".basename($filename).";" );
  24.   }
  25.   header("Content-Transfer-Encoding: binary" );
  26.   header("Content-Length: ".filesize($filename));
  27.   readfile("$filename" );


 
voila il ne te rest plus qu'a mettre cela en oeuvre


Message édité par ethernal le 10-01-2004 à 17:02:50
Reply

Marsh Posté le 10-01-2004 à 17:06:52    

Je me suis mal exprimé, c'était un exemple, je ne comptais certainement pas utilisé le script tel quel, c'était pour lui montrer un exemple (vu que, de plus, il faut que son script vérifie que l'utilisateur n'a pas déjà downloadé ce fichier). A part ça, je suis tout à fait d'accord avec toi pour ce qui est des mesures de sécurité.

Reply

Marsh Posté le 10-01-2004 à 17:11:47    

j'en étais sûr que toi tu le savais.
 
Mais il y a tellement de newbies qui récupèrent du code tel quel qu'il est utile de le préciser.
 
 :hello:  

Reply

Marsh Posté le 12-01-2004 à 00:02:59    

hehe :)  
bah merci bien pour toutes cet aide de votre part.
Je vais tenter avec ce que vous m'avez donner tout en faisant attention à la securité...
 
encore merci !!


---------------
/!\ Post powered by Phive-online.com /!\
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed