[PHP] Files buiten webdir downloaden.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Met een uploadscript, plaats ik bestanden op mijn webserver, echter buiten de webdirectory. Deze bestanden zijn dus niet bereikbaar via een browser o.i.d. om te downloaden.

Nu wil ik dat als ik ingelogd ben, ik deze bestanden wel kan downloaden. Echter gaat dit niet lukken met een gewone link. Lokatie op de server is bijvoorbeeld:

/oo_root/Articsun/koe.psp

Als je dit als link gebruik zodra je het bestand wilt downloaden, wordt dit (uiteraard):

http://server/oo_root/ArticSun/koe.psp

Hoe kan ik er voor zorgen dat iemand dus een bestand buiten mijn webdir kan downloaden, waarbij het het liefst er gewoon uit ziet als een "gewone" download?

Bedankt!

Acties:
  • 0 Henk 'm!

  • Markieman
  • Registratie: December 2001
  • Laatst online: 01-06 11:37
phptje maken:

header("Content-type: whatevercontenttypeitis");
file buiten webdir openen
Inlezen en printen
file sluiten
exit;

You do not fear them? - The Wraith? Naah. Now *clowns*, that's another story.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

PHP het bestand laten openen en dan streamen denk ik.... Waarom zou je dit willen? Waarom niet gewoon een beveiligde map op je webserver zelf?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Gebruik een PHP script die via de HTTP Header het bestand doorzend naar de gebruiker:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$extension=explode('.',$filename);

$extension=strtolower($extension[sizeof($extension)-1]);

switch($extension)
{
    case 'gz':      $content_type='application/x-gzip';         break;
    case 'zip':     $content_type='application/zip';            break;
    case 'pdf':     $content_type='application/pdf';            break;
    case 'png':     $content_type='image/png';                  break;
    case 'gif':     $content_type='image/gif';                  break;
    case 'jpg':     $content_type='image/jpeg';                 break;
    case 'txt':     $content_type='text/plain';                 break;
    case 'htm':     $content_type='text/html';                  break;
    case 'html':    $content_type='text/html';                  break;
    default:        $content_type='application/octet-stream';   break;
}

header('Content-disposition: filename=' . $filename);
header('Content-Type: ' . $content_type);


Nadeel is wel dat je zelf de MIME-types moet opgeven.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bestanden zijn persoonsgebonden, dus allemaal met beveiligde webdirs werken lijkt me niet echt makkelijk. Buiten de webdir: niemand kan er bij... tenzij jij het expliciet toekent...

Iig zal ik voor het downloaden de header / het type van het bestand moeten weten. Daar dit allerlei bestanden kunnen zijn, kan ik dit niet in een case plaatsen o.i.d., dus zal ik het type moeten opvragen.

En hier zullen uiteraard weer functies voor zijn...? :D

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21-09 18:44

gorgi_19

Kruimeltjes zijn weer op :9

Heeft PHP geen functie om het contenttype uit een bestand te halen? Moet dit echt op extension? Dit laatste kan problemen opleveren.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

gorgi_19 schreef op 04 mei 2004 @ 12:15:
Heeft PHP geen functie om het contenttype uit een bestand te halen? Moet dit echt op extension? Dit laatste kan problemen opleveren.
http://nl2.php.net/manual/en/function.mime-content-type.php
edit:
Zit er wel pas sinds PHP 4.3.0 in... :X

[ Voor 7% gewijzigd door NMe op 04-05-2004 12:17 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Billie
  • Registratie: Januari 2003
  • Laatst online: 16-09 20:27
gorgi_19 schreef op 04 mei 2004 @ 12:15:
Heeft PHP geen functie om het contenttype uit een bestand te halen? Moet dit echt op extension? Dit laatste kan problemen opleveren.
http://nl2.php.net/mime_content_type

Voila. :)

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21-09 18:44

gorgi_19

Kruimeltjes zijn weer op :9

offtopic:
erhm, 't was meer een retorische vraag aan darkbone voor zijn eigen scriptje.. :+

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Markieman
  • Registratie: December 2001
  • Laatst online: 01-06 11:37
gorgi_19 schreef op 04 mei 2004 @ 12:15:
Heeft PHP geen functie om het contenttype uit een bestand te halen? Moet dit echt op extension? Dit laatste kan problemen opleveren.
Nope, dat zou namelijk geen doen zijn.
Check deze site eens, deze probeert van veel formaten de opbouw te documenteren. Schrijf daar maar eens een functie omheen. Misschien dat je zelf zo'n functie kan schrijven aan de hand van deze site.

Maar op basis van extensie de contenttype bepalen is niet zo vreemd hoor. Apache doet dat volgens mij ook...

Je kan altijd nog ieder bestand als octet-stream laten downloaden, dan kan de user ermee bepalen wat hij doet. Dat scheelt ook het in-browser openen van bijvoorbeeld pdf en word bestanden (ik hekel IE wat dat betreft)


edit:
Ik was wat laat en zo'n functie blijkt dus wel te bestaan, hoewel ik twijfel of die ook niet op extensie werkt en of die *alle* formaten ondersteunt =)

edit2:
ok, die functie werkt dus met behulp van magic.mime en die kijkt dus echt in het bestand, ik zou dus voor die functie gaan...

[ Voor 18% gewijzigd door Markieman op 04-05-2004 12:27 ]

You do not fear them? - The Wraith? Naah. Now *clowns*, that's another story.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

gorgi_19 schreef op 04 mei 2004 @ 12:19:
offtopic:
erhm, 't was meer een retorische vraag aan darkbone voor zijn eigen scriptje.. :+
Smoesjes! :+

On-topic: ik blijf erbij dat het beter zou zijn het anders op te lossen, in een mappenstructuur binnen je webserver. Maar wie ben ik? :Y)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Markieman schreef op 04 mei 2004 @ 12:21:
Ik was wat laat en zo'n functie blijkt dus wel te bestaan, hoewel ik twijfel of die ook niet op extensie werkt en of die *alle* formaten ondersteunt =)
Content type staat gewoon in de header van elke file, dus waarom zou je het niet uit kunnen lezen voor elk type? ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Markieman
  • Registratie: December 2001
  • Laatst online: 01-06 11:37
NMe84 schreef op 04 mei 2004 @ 12:24:
[...]

Content type staat gewoon in de header van elke file, dus waarom zou je het niet uit kunnen lezen voor elk type? ;)
Content-type staat in geen enkele file =)

Open bijvoorbeeld een GIFje in een hex-editor. Daar staat nergens Content-type: image/gif :)

You do not fear them? - The Wraith? Naah. Now *clowns*, that's another story.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Markieman schreef op 04 mei 2004 @ 12:28:
[...]


Content-type staat in geen enkele file =)

Open bijvoorbeeld een GIFje in een hex-editor. Daar staat nergens Content-type: image/gif :)
Maar er zit wel degelijk een header in die aangeeft wat voor soort bestand iets is. Als ik een avi hernoem naar wmv en open in WMP, dan geeft WMP de melding dat het bestandsformaat niet klopt met de extensie. Het lijkt me dus dat het best uit te lezen is.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Markieman
  • Registratie: December 2001
  • Laatst online: 01-06 11:37
Dat klopt uiteraard, maar je moet die headers wel kunnen herkennen. Het is niet zo dat een header in de vorm van een MIME content type opgeslagen wordt.

Ofwel die functie waar we het over hebben moet dus een lijstje met headers met de daarbij horende content-types hebben. Dit zijn alleen bekende veelgebruikte type headers. Als er onbekendere bestanden worden geupload zullen die niet herkent worden.

You do not fear them? - The Wraith? Naah. Now *clowns*, that's another story.


Acties:
  • 0 Henk 'm!

  • kamerplant
  • Registratie: Juli 2001
  • Niet online
NMe84 schreef op 04 mei 2004 @ 12:37:
[...]

Maar er zit wel degelijk een header in die aangeeft wat voor soort bestand iets is. Als ik een avi hernoem naar wmv en open in WMP, dan geeft WMP de melding dat het bestandsformaat niet klopt met de extensie. Het lijkt me dus dat het best uit te lezen is.
Hij herkent dat het bestand overeenkomt met zijn eigen bestandsstructuur oid, lijkt mij.

🌞🍃


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bestaat er niet iets van een BINARY mime type of zo, waarmee je gewoon praktisch alle bestanden op deze manier kan downloaden? Want het lijkt me geen doen het per bestand / extentie etc. op te gaan geven. Upload weer iemand een "raar" bestandje, kan je het weer niet downloaden...

[qoute]
Je kan altijd nog ieder bestand als octet-stream laten downloaden, dan kan de user ermee bepalen wat hij doet. Dat scheelt ook het in-browser openen van bijvoorbeeld pdf en word bestanden (ik hekel IE wat dat betreft)
[/qoute]

Sorry ik lees niet altijd even goed :)

Maar die functie zou dus het beste resultaat kunnen leveren? Want wat is er dan op "tegen" om die octet-stream te gebruiken?

[ Voor 44% gewijzigd door Verwijderd op 04-05-2004 12:53 ]


Acties:
  • 0 Henk 'm!

Verwijderd

gorgi_19 schreef op 04 mei 2004 @ 12:15:
Heeft PHP geen functie om het contenttype uit een bestand te halen? Moet dit echt op extension? Dit laatste kan problemen opleveren.
Aha wist ik niet, ook niet echt om gezocht eerlijk gezegd. Maar indien je controle wilt op welke bestanden je wilt laten doorsluizen dan moet je natuurlijk nog altijd een restrictieve lijst opstellen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Restricties op wat voor soort bestanden wel / niet mogen is niet echt van toepassing. Het is bedoelt als opslagmedium, en daar moet je eigenlijk alles in op kunnen slaan, alleen te never te nooit uitvoeren :)

Wie stemt er voor octed en wie voor de MIME functie? :D

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

ik heb het als oc-tet gedaan:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php 
  require_once("dir_db_header.inc");

  $dirpath = getDirPath($_GET['dirname']);  

  if (ereg("(\.\.[/\])+",$_GET['dirpostfix'])
    ||ereg("(\.\.[/\])+",$_GET['file'])
    || "uploadtest\zonnet.php"==$_GET['file']
     )      
    die("Dat mag je helemaal niet zien, sufkop!");
        
  if (isset($_GET['dirpostfix'])&&isset($_GET['file']))
  {
    $path=$dirpath.$_GET['dirpostfix']."/".$_GET['file'];
    if(is_file($path))
        if(filesize($path)<25000000)
        {
            $filesize=filesize($path);
            //$data=file_get_contents($path);
            header("Cache-control: private"); 
            header("Content-type: application/stream");
            header('Content-Disposition: attachment; filename="'. $_GET['file'].'"');
            header('Content-Length: ' . filesize($path)); 
            $fp=fopen($path, "rb");
            rewind($fp);
            fpassthru($fp);
    //        echo " size= ".filesize($path)."path=".$path;
        }
        else echo "Bestand is te groot. ";
    else //if not a file
        echo "helaas is er iets mis gegaan: het bestand bestaat niet. De gegeven parameters:<BR/>
            _GET['dirname']=".$_GET['dirname']."<BR/ >
            _GET['dirpostfix']=".$_GET['dirpostfix']."<BR/ >
            _GET['file']=".$_GET['file']."<BR/ >
            path=$path<br/ >";
  }

?>


edit:
vergeet niet dat bovenste stukje, anders kunnen ze ook buiten de directory komen met ../ enz.

[ Voor 44% gewijzigd door MBV op 04-05-2004 13:13 . Reden: stukje overbodig commentaar weggehaald ]


Acties:
  • 0 Henk 'm!

Verwijderd

Misschien toch best voor octet kiezen, heb hier daarnet ff zitten testen en toen ik de MIME-TYPE van een pdf vroeg kreeg ik gewoon niks terug, terwijl het bij andere bestanden wel lukte...

*edit*
Hmm die functie blijkt toch niet helemaal te werken zoals je verwacht hoor ook voor een .doc gaf hij gewoon niks terug...

Ik zou de functie dan ook liever niet gebruiken.

[ Voor 34% gewijzigd door Verwijderd op 04-05-2004 13:23 ]


Acties:
  • 0 Henk 'm!

  • Markieman
  • Registratie: December 2001
  • Laatst online: 01-06 11:37
Je kan het ook zo doen, als eerste functie van php aanroepen
Indien geen resultaat dan een switch met wat extensies doen.
Daarin een default met application/octet-stream

You do not fear them? - The Wraith? Naah. Now *clowns*, that's another story.

Pagina: 1