Download mit PHP und Sessions absichern..

Apache, Lighttpd, nginx, Cherokee
marcooooooo
Posts: 15
Joined: 2007-04-30 16:31
Location: Mendencity

Download mit PHP und Sessions absichern..

Post by marcooooooo » 2007-05-05 22:34

Bislang benutze ich unter http://alohadakine.org/downloads/
die session funktionen um content grabbing zu verhindern.. klappt auch bei kleinen dateien bis ca. 300mb problemlos..

aber bei dateien die 700mb und größer sind "haut das meinen webserver aus den latschen" :]

ich schätze mal das liegt daran das das phpfile die gesamte datein "öffnet" und "in den arbeitsspeicher???" läd bevor sie an den client geschickt wird?!



Falls das so stimmt.. jemand eine bessere Idee, bzw einen Verbesserungsvorschlag.. würde nämlich gerne keine Probleme mit großen Dateien haben :]

miker
Posts: 64
Joined: 2005-03-26 13:33
Location: Wildeshausen

Re: Download mit PHP und Sessions absichern..

Post by miker » 2007-05-06 08:52

Vielleicht mal lighttpd mit mod_secdownload austesten?

Allgemein versteh ich aber auch die Problematik nicht so ganz. Was haben die Session-Funktionen damit zu tun? Wenn du den Download so in der Art ausgibst

Code: Select all

<?php
       header ( "Content-Type: application/octet-stream" );
       header ( "Content-Length: " . filesize ( $Datei ) );
       header ( "Content-Disposition: attachment; filename=$DateiName" );
       readfile ( $Datei );
?>
dann wird das Ding nicht komplett in den Speicher geladen, sondern gestreamed. Solltest also keine Probleme mit deinem Arbeitsspeicher bekommen. Trotzdem ist die lighty-Lösung sicherlich ressourcensparender.

marcooooooo
Posts: 15
Joined: 2007-04-30 16:31
Location: Mendencity

Re: Download mit PHP und Sessions absichern..

Post by marcooooooo » 2007-05-06 13:18

habs im moment so:

Code: Select all

            // checking if file is available ;)
            $check_dl = @fopen("".$datafile."","r");

    if( $check_dl ) // natürlich mit { auf und } ;)

Code: Select all

        // we're going to tell the browser what filetype the file should become
        header( "Content-type: $mimetype" );
        
        // we're going to tell the browser what filesize the file is
        header( "Content-Length: ".@filesize( $datafile ) );
        
        // we're going tell the browser what filename the file should get
        header( 'Content-Disposition: attachment; filename="'.$filename.'"' );
        
        // now we're going to include the whole filecode
        readfile( $datafile);
irgendwas, das die ressource so übel beanspruchen könnte?

die daten holt er sich aus der db


-> mir mir auch klar, dass das kaum was mit den session zu tun haben kann -die auslastung- aber wollte trotzdem kurz erklären worum's eigentlich geht.. damit nicht nachher einer kommt der meint -> mach doch einfach einen direct link auf die file.. ;)

dtdesign
Posts: 391
Joined: 2006-09-05 21:12
Location: Berlin

Re: Download mit PHP und Sessions absichern..

Post by dtdesign » 2007-05-06 14:28

Versuch mal anstatt eines fopen ein is_readable

marcooooooo
Posts: 15
Joined: 2007-04-30 16:31
Location: Mendencity

Re: Download mit PHP und Sessions absichern..

Post by marcooooooo » 2007-05-06 20:14

werd ich gleich mal mit ner größeren datei ausprobieren.. wenns funkt wäre super..

-> habe auch gerade gesehen, dass ich das fopen nicht geclosed habe in der datei die die downloads managed..

könnte natürlich der grund gewesen sein.. wir werden sehen.. poste natürlich ob's wie gewünscht funkt :)

marcooooooo
Posts: 15
Joined: 2007-04-30 16:31
Location: Mendencity

Re: Download mit PHP und Sessions absichern..

Post by marcooooooo » 2007-05-06 23:24

klappt leider immer noch nicht weder du das ändern des mime types auf octet-stream noch durch das ändern auf is_readable..

also funken tuts immer noch.. aber immer noch genaus ressourcenfressend wie vorher

blattlaus
Posts: 52
Joined: 2007-03-08 13:45

Re: Download mit PHP und Sessions absichern..

Post by blattlaus » 2007-05-07 08:28

Kommentar von php.net zur Readfile:
When using readfile() with very large files, it's possible to run into problems due to the memory_limit setting; apparently readfile() pulls the whole file into memory at once.
(Das ganze taucht natürlich nicht in der Doku auf...PHP halt)

Versuch mal eine !feof-fread Schleife, möglicherweise funktioniert das.

marcooooooo
Posts: 15
Joined: 2007-04-30 16:31
Location: Mendencity

Re: Download mit PHP und Sessions absichern..

Post by marcooooooo » 2007-05-07 10:10

so.. nun scheint es soweit zu gehen.. das problem ist jetzt aber:

irgendwie scheint es da irgendwie sowas wie einen "lock" zu geben (keinen log ;))

wenn der die file läd .. sind keine anderen pages auf meinem server ansurfbar.. ist die file fertig runtergeladen, bzw. breche ich den download ab.. sind die site die ich versucht habe zu öffnen sofort da..

also: eine file wird runtergeladen .. von irgendwem.. ->
keine weiteren seiten können so lange aufgerufen werden bis der dl beendet wurde..

das kann's ja irgendwie auch ned sein ;)

marcooooooo
Posts: 15
Joined: 2007-04-30 16:31
Location: Mendencity

Re: Download mit PHP und Sessions absichern..

Post by marcooooooo » 2007-05-09 03:10

So nun geht es endlich einwandfrei..

Also jedermann der vorhat seine Downloads dahingehend abzusichern, dass diese nur von seiner Seite aus aufgerufene werden können und verhindern möchte, dass Fremdseiten direkt auf die herunterladbaren Dateien verlinken, findet bestimmt Gefallen an folgendem Script.

(Ich benutze noch zusätzlich das mod_rewrite module - um die urls "schicker zu machen")

Code: Select all

// we're going to tell the browser what filetype the file should become
           header("Pragma: public");
           header("Expires: 0");
           header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: private",false); 
        header ( "Content-Type: application/octet-stream" ); 
        // we're going to tell the browser what filesize the file is
        header( "Content-Length: ".$file['file_size'] );
        
        // we're going tell the browser what filename the file should get
        header( 'Content-Disposition: attachment; filename="'.$filename.'"' );
        
        // now we're going to include the whole filecode
function readfile_chunked($filename,$retbytes=true) {
   $chunksize = 1*(1024*1024); // how many bytes per chunk
   $buffer = '';
   $cnt =0;
   // $handle = fopen($filename, 'rb');
   $handle = fopen($filename, 'rb');
   if ($handle === false) {
       return false;
   }
   while (!feof($handle)) {
       set_time_limit(0);
       $buffer = fread($handle, $chunksize);
       echo $buffer;
       ob_flush();
       flush();
       if ($retbytes) {
           $cnt += strlen($buffer);
       }
   }
       $status = fclose($handle);
   if ($retbytes && $status) {
       return $cnt; // return num. bytes delivered like readfile() does.
   }
   return $status;

} 


        readfile_chunked($datafile);
        exit;

und ganz wichtig.. -> das ganze funktioniert jetzt auch ohne speicher-exzesse oder absolute prozessorauslastung! :-D

Have Phun :wink: