Avatar billede hoppe11 Nybegynder
08. marts 2008 - 17:21 Der er 27 kommentarer og
1 løsning

stream fil

hvad er det lige jeg gør galt her??

i Firefox virker det umiddelbart fint, men med IE står den til at hente en eller anden slags html fil??? men når man henter er det rigtigt nok den fil men streamer

if($_GET['file'])
{
    if(is_file($_GET['file']))
    {
        $_GET['file'] = stripslashes($_GET['file']);
       
        header('Content-disposition: attachment; filename="'.addslashes(basename($_GET['file'])).'" Content-length: '.filesize($_GET['file']));
       
        echo file_get_contents($_GET['file']);
    }
   
    exit;
}
Avatar billede olebole Juniormester
08. marts 2008 - 17:40 #1
<ole>

"hvad er det lige jeg gør galt her??" >> ikke ret meget mere, end alt det, du _kan_ gøre galt  :)

- men, den ser da vældig sjov ud! Er det meningen, at dine brugere skal kunne læse al indhold (kode) af alle filer på hele serveren? Giv mig femten sammenhængende minutter med den fil og du har en tom database - og sikkert ikke ret meget andet, der virker på serveren. En øvet hacker skal højst bruge fem  ;o)

/mvh
</bole>
Avatar billede olebole Juniormester
08. marts 2008 - 17:41 #2
Hint: Du må aldrig-aldrig-aldrig foretage dig noget på baggrund af uvaliderede brugerinput!
Avatar billede hoppe11 Nybegynder
08. marts 2008 - 17:47 #3
du siger noget :)

men kan du stadig sige mig hvorfor mit problem opstår?
Avatar billede hoppe11 Nybegynder
08. marts 2008 - 17:49 #4
ud over det er det heller ikke som om at den får content-length med, da den ikke viser hvor langt (procent) downloadningen er nået.. men kun hvor eget data som er loaded
Avatar billede hoppe11 Nybegynder
08. marts 2008 - 17:53 #5
men lige en ting til det med sikkerheden

kunne det ikke bare være nok at tjekke om den pågældende fil ikke ligger længere tilbage i "filtræet" end mappen hvor index.php er?
Avatar billede hoppe11 Nybegynder
08. marts 2008 - 18:08 #6
det her burde vel være nok? :)

altså at filer med php-extesions samt filer som har et punktum som begyndelse ikke kan læses?

if($_GET['file'])
{
    $_GET['file'] = stripslashes($_GET['file']);
    $pathinfo_arr = pathinfo($_GET['file']);
   
    if(!in_array($pathinfo_arr['extension'], array('php')) && $_GET['file']{0} != '.')
    {
        if(is_file($_GET['file']))
        {
            header('Content-disposition: attachment; filename="'.addslashes(basename($_GET['file'])).'" Content-length: '.filesize($_GET['file']));
           
            echo file_get_contents($_GET['file']);
        }
       
        exit;
    }
}
Avatar billede coderdk Praktikant
08. marts 2008 - 23:33 #7
Prøv at lave:

header('Content-disposition: attachment; filename="'.addslashes(basename($_GET['file'])).'" Content-length: '.filesize($_GET['file']));

om til:

header('Content-disposition: attachment; filename="'.addslashes(basename($_GET['file'])).'"');
header('Content-length: '.filesize($_GET['file']));
Avatar billede hoppe11 Nybegynder
09. marts 2008 - 00:18 #8
det hjalp coderdk :)

men kan du så svare mig på om det er tiltrækkeligt med følgende if-statement for at sikre unødig tilgang til filer osv. (mit indlæg fra 08/03-2008 18:08:27)?

if(!in_array($pathinfo_arr['extension'], array('php')) && $_GET['file']{0} != '.')
Avatar billede coderdk Praktikant
09. marts 2008 - 01:02 #9
Jeg ville have mine downloadfiler ét sted, f.eks. i mappen "to-download" og bruge noget i stil med:

    // SÆT FULDE STI TIL DOWNLOADMAPPEN HER
    $BASE = "/www/default/ud/";
   
    if ( !empty( $_GET['file'] ) )
    {
        if ( FALSE !== ( $fullpath = realpath( $BASE . $_GET['file'] ) ) )
        {
            if ( substr( $fullpath, 0, strlen( $BASE ) ) == $BASE )
            {
                header( 'Content-disposition: attachment; filename="' . basename( $fullpath ) . '"' );
                header( 'Content-length: ' . filesize( $fullpath ) );
                readfile( $fullpath );
                exit;
            }
        }
    }
   
    echo "Permission denied";
Avatar billede coderdk Praktikant
09. marts 2008 - 01:05 #10
(Alt i og under denne mappe vil kunne downloades af scriptet, intet andet)
Avatar billede hoppe11 Nybegynder
09. marts 2008 - 19:44 #11
noget andet jeg har gået og tænkt over..

er det muligt at vide om et specifikt download bliver fuldført eller ej?

jeg tænker på.. ved ikke om du kender www.beatport.com, men den "ved" om du downloader en fil til enden også efter du har lukket siden og filoverførslen fortsætter..
Avatar billede coderdk Praktikant
09. marts 2008 - 20:42 #12
Ja, men så skal du bruge fopen/fread/fclose i stedet for file_get_contents eller readfile - du skal checke på connection_aborted()... Jeg har en rigtig gammel download-klasse et sted, jeg skrev til et site... Ved dog ikke om jeg kan finde den :D
Avatar billede coderdk Praktikant
09. marts 2008 - 20:43 #13
Uhm, sammen med ignore_user_abort(TRUE) naturligvis...
Avatar billede hoppe11 Nybegynder
10. marts 2008 - 20:22 #14
kunne du finde det? :)

ellers tak for hjælpen
Avatar billede coderdk Praktikant
10. marts 2008 - 21:12 #15
Ikke lige, men start scriptet med ignore_user_abort(TRUE); og så læs f.eks. 8192 bytes ad gangen med fopen og fread i en while !feof-løkke hvor du inde i løkken checker for connection_aborted(), i.e.

if ( $fp = fopen( "dokument.doc", "rb" ) )
{
  $aborted = FALSE;
  while ( !feof( $fp ) )
  {
      $cnt = fread( $fp, 8192 );
      echo $cnt;
      $aborted = connection_aborted();
      if ( $aborted ) break;
  }
  fclose( $fp );
  // $aborted er TRUE hvis brugeren abortede...
}
Avatar billede hoppe11 Nybegynder
11. marts 2008 - 20:18 #16
jeg sidder og roder lidt med scriptet

umiddelbart når man downloader en fil med scriptet kan man ikke lave andre requests fra samme klient? det er måske ikke muligt?
Avatar billede coderdk Praktikant
11. marts 2008 - 21:39 #17
prøv med en anden browser - f.eks. firefox og internet explorer eller opera
Avatar billede hoppe11 Nybegynder
12. marts 2008 - 00:25 #18
jo, så virker det.. men er det ikke muligt at lave noget så det kan blive muligt at surfe videre i samme klient? ellers vil det jo blive lidt problematisk :(

ellers virker scriptet som det skal :)
Avatar billede coderdk Praktikant
12. marts 2008 - 01:09 #19
hmm jeg ved det faktisk ikke - det må være et eller andet med serveren...
Avatar billede hoppe11 Nybegynder
12. marts 2008 - 15:59 #20
du har måske slet ingen ide om hvad det kan skyldes?
Avatar billede coderdk Praktikant
12. marts 2008 - 21:17 #21
Nej ikke lige - Noget med samtidige forbindelser i apache/php/session kunne jeg forestille mig...
Jeg tror man kan omgå det ved at downloade fra et underdomæne (og derved tvinger en ny session i gang)...
Avatar billede hoppe11 Nybegynder
12. marts 2008 - 22:34 #22
okey.. og igen.. tak for hjælpen :D
Avatar billede coderdk Praktikant
12. marts 2008 - 22:56 #23
np :)
Avatar billede hoppe11 Nybegynder
25. marts 2008 - 21:04 #24
det er mig igen :)

$aborted = 0;
ignore_user_abort(TRUE);
if($fp = fopen($_GET['file'], 'rb'))
{
    while(!feof($fp))
    {
        echo fread(fp, 8192);
       
        $aborted = connection_aborted();
        if($aborted) break;
    }
   
    fclose($fp);
   
    if($aborted) // gør noget
}

selvom forbindelsen ikke bliver brudt og hele filen bliver hentet bliver $aborted sat?
Avatar billede coderdk Praktikant
25. marts 2008 - 22:35 #25
Hmmm måske er det fordi hele filen er sendt? Prøv lige:

$aborted = 0;
ignore_user_abort(TRUE);
if($fp = fopen($_GET['file'], 'rb'))
{
    fseek( $fp, 0, SEEK_END );
    $fz = ftell( $fp );
    fseek( $fp, 0 );
    $c = 0;
    while(!feof($fp))
    {
        $cnt = fread(fp, 8192);
        $c += strlen( $cnt );
        echo $cnt;
        $aborted = connection_aborted();
        if($aborted) break;
    }
 
    fclose($fp);
 
    if($aborted && $fz != $c ) // gør noget
}

Her checker jeg om den rent faktisk har sendt hele filen...
Avatar billede coderdk Praktikant
25. marts 2008 - 22:39 #26
Hmm prøv lige bare:

$aborted = 0;
ignore_user_abort(TRUE);
if($fp = fopen($_GET['file'], 'rb'))
{
    while ( FALSE == ( $nfeof = !feof( $fp ) ) )
    {
        echo fread(fp, 8192);
     
        $aborted = $nfeof && connection_aborted();
        if($aborted) break;
    }
 
    fclose($fp);
 
    if($aborted) // gør noget
}
Avatar billede hoppe11 Nybegynder
26. marts 2008 - 17:31 #27
ved den første får jeg følgende fejl og tror det er når filen er loaded færdig

Warning: fread(): supplied argument is not a valid stream resource

med den anden sker der også noget underligt
Avatar billede coderdk Praktikant
26. marts 2008 - 17:46 #28
$cnt = fread(fp, 8192);

skal naturligvis være

$cnt = fread($fp, 8192);

det gælder begge eksempler - sådan er det når man aldrig tester noget af det man skriver :( hehehe
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester