Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Downloaden afbeeldingen / pdf inplaats van openen

Pagina: 1
Acties:

  • Maverick2001
  • Registratie: Februari 2001
  • Laatst online: 20-11 21:07

Maverick2001

Never look back

Topicstarter
Voor een kleine file manager wil ik linkjes met een download (ipv dat de afbeelding of PDF in de browser geopend wordt.

De onderstaande code download zowel PDF of JPG bestanden echter zijn de JPG bestanden niet te openen. Ik zie wel dat de bestandsgrote goed is echter het lijkt alsof de codering niet goed is.

code:
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
    <?php
        if (isset($_GET['file_source'])) {
            $fullPath = $_GET['file_source'];
            if($fullPath) {
                $fsize = filesize($fullPath);
                $path_parts = pathinfo($fullPath);
                $ext = strtolower($path_parts["extension"]);
                switch ($ext) {
                    case "pdf":
                    header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");    
                    header("Content-type: application/pdf");                    

                    break;
                    case "jpg":
                    header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");    
                    header("Content-type: image/jpg");

                    break;
                    header("Content-type: application/octet-stream");
                    header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
                    
                }
                if($fsize) {
                  header("Content-length: $fsize");
                }
                readfile($fullPath);
                exit;
            }
        }
    ?>

[ Voor 5% gewijzigd door Maverick2001 op 09-01-2014 22:04 ]

Pura Vida


  • Kwastie
  • Registratie: April 2005
  • Laatst online: 21-11 19:24

Kwastie

Awesomeness

Volgens mij is de header van een .jpg bestand "image/jpeg" (bron: Wikipedia: Internet media type)

When I get sad i stop being sad and be awesome instead


  • Maverick2001
  • Registratie: Februari 2001
  • Laatst online: 20-11 21:07

Maverick2001

Never look back

Topicstarter
Kwastie schreef op donderdag 09 januari 2014 @ 23:00:
Volgens mij is de header van een .jpg bestand "image/jpeg" (bron: Wikipedia: Internet media type)
Je hebt gelijk dat was idd een typ fout.. maar dat verhelpt het probleem niet.

Pura Vida


  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

en je kan gelijk de index.php downloaden. how conveniant ;)

neem ik ff aan hoor ik weet eigenlijk niet wat er omheenzit verder, maar ik neem zomaar even aan dat deze shizlle door de url komt ?

[ Voor 53% gewijzigd door Fish op 09-01-2014 23:17 ]

Iperf


  • Alain
  • Registratie: Oktober 2002
  • Niet online
Is het een probleem? De gebruiker kan normaal gesproken kiezen om het te downloaden of om het te openen. Waarom wil je deze keuze forceren?

You don't have to be crazy to do this job, but it helps ....


  • Maverick2001
  • Registratie: Februari 2001
  • Laatst online: 20-11 21:07

Maverick2001

Never look back

Topicstarter
AlainS schreef op donderdag 09 januari 2014 @ 23:16:
Is het een probleem? De gebruiker kan normaal gesproken kiezen om het te downloaden of om het te openen. Waarom wil je deze keuze forceren?
Het idee is om bijvoorbeeld af te dwingen dat een PDF gedownload wordt en niet zoals safari in een nieuw tabblad geopend wordt. Er is ook een knop om het document / afbeelding te bekijken.

En het is wel een probleem als de gedownloade JPG niet te openen valt natuurlijk.

[ Voor 8% gewijzigd door Maverick2001 op 09-01-2014 23:24 ]

Pura Vida


  • Alain
  • Registratie: Oktober 2002
  • Niet online
Maverick2001 schreef op donderdag 09 januari 2014 @ 23:19:
[...]


Het idee is om bijvoorbeeld af te dwingen dat een PDF gedownload wordt en niet zoals safari in een nieuw tabblad geopend wordt. Er is ook een knop om het document / afbeelding te bekijken.
Dat snap ik, maar waarom zou je dit willen? De gebruiker weet of hij/zij iets wil bekijken of op wil slaan. In beide gevallen wordt het gedownload.

Maar als je dit echt wilt zou ik met javascript een save as dialog maken.

[ Voor 5% gewijzigd door Alain op 09-01-2014 23:28 ]

You don't have to be crazy to do this job, but it helps ....


  • Maverick2001
  • Registratie: Februari 2001
  • Laatst online: 20-11 21:07

Maverick2001

Never look back

Topicstarter
AlainS schreef op donderdag 09 januari 2014 @ 23:27:
[...]


Dat snap ik, maar waarom zou je dit willen? De gebruiker weet of hij/zij iets wil bekijken of op wil slaan. In beide gevallen wordt het gedownload.

Maar als je dit echt wilt zou ik met javascript een save as dialog maken. Je kunt de werking van een browser niet altijd beïnvloeden.
Maar voor de interface is het toch best een prima idee, een knop 'download' en een knop 'bekijk'?
Dat is toch niet zo'n gekke gedachte.

Pura Vida


  • Alain
  • Registratie: Oktober 2002
  • Niet online
Je kunt een bestand wel server side gaan manipuleren, maar dat is niet wat je wilt. Dit moet je client side oplossen.

You don't have to be crazy to do this job, but it helps ....


  • Maverick2001
  • Registratie: Februari 2001
  • Laatst online: 20-11 21:07

Maverick2001

Never look back

Topicstarter
Maar het gaat er toch juist om dat dit gewoon moet kunnen werken? Het downloaden gaat goed alleen is de jpg niet te openen.

Pura Vida


  • Alain
  • Registratie: Oktober 2002
  • Niet online
Misschien omdat het jpeg is en geen jpg?

Hoe dan ook vind ik dit geen oplossing.

You don't have to be crazy to do this job, but it helps ....


  • Maverick2001
  • Registratie: Februari 2001
  • Laatst online: 20-11 21:07

Maverick2001

Never look back

Topicstarter
Dat je het geen oplossing vind, dat mag natuurlijk.

Jpeg verhelpt het probleem niet.

Pura Vida


  • Rob
  • Registratie: Februari 2000
  • Niet online

Rob

Kijk hier eens naar: http://stackoverflow.com/...th-javascript-window-open

Overigens is je code heel onveilig omdat elk bestand er mee te lezen is...

In the beginning the Internet was a bunch of smart users with dumb terminals. Now...


  • DJMaze
  • Registratie: Juni 2002
  • Niet online
fish schreef op donderdag 09 januari 2014 @ 23:16:
en je kan gelijk de index.php downloaden. how conveniant ;)

neem ik ff aan hoor ik weet eigenlijk niet wat er omheenzit verder, maar ik neem zomaar even aan dat deze shizlle door de url komt ?
?file_source=config.php werkt gewoon
?file_source=/etc/passwd werkt als open basedir niet goed staat :)
?file_source=c:\boot.ini idem verhaal

Maak je niet druk, dat doet de compressor maar


  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

DJMaze schreef op vrijdag 10 januari 2014 @ 13:43:
[...]


?file_source=config.php werkt gewoon
?file_source=/etc/passwd werkt als open basedir niet goed staat :)
?file_source=c:\boot.ini idem verhaal
Als bij jou c:.. werkt zou ik iig de rechten van de apache(?) service aanpassen zodat die alleen maar in de apache, php, domeinen kan komen. en niet als admin/root draaien

Iperf


  • Rob
  • Registratie: Februari 2000
  • Niet online

Rob

fish schreef op vrijdag 10 januari 2014 @ 15:24:
[...]


Als bij jou c:.. werkt zou ik iig de rechten van de apache(?) service aanpassen zodat die alleen maar in de apache, php, domeinen kan komen. en niet als admin/root draaien
In je code moet je van het worst-case scenario uitgaan, het zou zo kunnen gebeuren dat je scriptje op een slecht beveiligde server staat. De beveiliging moet dus in de code gebouwd worden.

In the beginning the Internet was a bunch of smart users with dumb terminals. Now...


  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

Eens,

Maar dat betekend niet dat je in de code geen fouten kan maken. En dit is puur een maatregel om shit te voorkomen die daaruit voort kan komen.

Een webserver hoeft maar in een bepaald gebied te operren. dus geef je die (user(s)) toesteming om alleen maar daar te kunnen komen. Wat je ook met normale gebruikers doet die je beter vertrouwd dan een random lul op internet.

Je gaat toch ook niet als root de database in met een webservice, dit is exact hetzelfde maar dan op file niveau

[ Voor 56% gewijzigd door Fish op 10-01-2014 16:26 ]

Iperf


  • roeleboel
  • Registratie: Maart 2006
  • Niet online

roeleboel

en zijn beestenboel

1. Hier ga je inderdaad de security moeten herbekijken
2. als je deze header toevoegt, werkt het dan wel?
PHP:
1
header('Content-Transfer-Encoding: binary');

De makkelijkste manier om hyprocrieten boos te krijgen? Confronteer ze met hun eigen uitspraken...


  • Miyamoto
  • Registratie: Februari 2009
  • Laatst online: 20-11 21:15
Je code-snippet werkt hier wel. Zeker weten dat het bron-bestand ($fullPath) klopt?

Check verder de manual-page van readfile(): Example #1 Forcing a download using readfile()

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;

  • HollowGamer
  • Registratie: Februari 2009
  • Niet online
Een eenvoudiger manier: laat de afbeelding/PDF inpakken in een .zip als de gebruiker download van de website.

  • Adion
  • Registratie: Januari 2001
  • Laatst online: 08:27
Heb je het gedownloade bestand al eens met een hex-editor vergeleken met het oorspronkelijke bestand?

In je openingspost lijkt het of er voor de aanvang van php een tab staat. Komt die tab niet mee in je bestand terecht?

VirtualDJ 2024 - Fast Image Resizer - Instagram


  • Rob
  • Registratie: Februari 2000
  • Niet online

Rob

fish schreef op vrijdag 10 januari 2014 @ 16:21:
Eens,

Maar dat betekend niet dat je in de code geen fouten kan maken. En dit is puur een maatregel om shit te voorkomen die daaruit voort kan komen.

Een webserver hoeft maar in een bepaald gebied te operren. dus geef je die (user(s)) toesteming om alleen maar daar te kunnen komen. Wat je ook met normale gebruikers doet die je beter vertrouwd dan een random lul op internet.

Je gaat toch ook niet als root de database in met een webservice, dit is exact hetzelfde maar dan op file niveau
Beveiliging is nodig op 3 lagen
- De server laag: systeembeheerders moeten er voor zorgen dat de server veilig is
- De code laag: programmeurs moeten er voor zorgen dat hun code veilig is, waar het dan ook op draait
- De configuratie laag: die is voor de gebruiker, die idd niet met root de database in moet gaan

Jouw voorbeeld is dus niet exact hetzelfde, want een eindgebruiker kan de fout maken in het geval van de database. Overigens is dat ook weer door de programmeur op te vangen :)

In the beginning the Internet was a bunch of smart users with dumb terminals. Now...


  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

wat probeer je nou te zeggen ?
Dat het ok is dat je vanuit je webserver met verkeerde code op plekken kan komen waar je niet hoort te komen? of ben je het met me eens ?

ik weet niet vanuit welk standpunt jij denkt maar een random gebruiker van een website hoort helemaal niet bij de configuratie van wat dan ook op die server te komen. en al helemaal niet bij de configuratie van de database verbinding.

Iperf


  • Miyamoto
  • Registratie: Februari 2009
  • Laatst online: 20-11 21:15
Adion schreef op zaterdag 11 januari 2014 @ 10:28:
Heb je het gedownloade bestand al eens met een hex-editor vergeleken met het oorspronkelijke bestand?

In je openingspost lijkt het of er voor de aanvang van php een tab staat. Komt die tab niet mee in je bestand terecht?
Scherp! Blijkbaar is dit niet het hele bestand, wel? Wel vreemd dat TS aangeeft dat de bestandsgrootte klopt... Tenzij ie dat in Windows Verkenner heeft bekeken.
HollowGamer schreef op vrijdag 10 januari 2014 @ 19:24:
Een eenvoudiger manier: laat de afbeelding/PDF inpakken in een .zip als de gebruiker download van de website.
:F

  • Maverick2001
  • Registratie: Februari 2001
  • Laatst online: 20-11 21:07

Maverick2001

Never look back

Topicstarter
Miyamoto schreef op zaterdag 11 januari 2014 @ 13:40:
[...]

Scherp! Blijkbaar is dit niet het hele bestand, wel? Wel vreemd dat TS aangeeft dat de bestandsgrootte klopt... Tenzij ie dat in Windows Verkenner heeft bekeken.


[...]

:F
Er is inderdaad iets mis met de Tab! Dat is het probleem.

Verder is het meer even het testen van de mogelijkheden. Het is niet dat ik het daadwerkelijk ga implementerenm het was voor mij meer testen of ik met een eenvoudige readdir een eenvoudige file-manager kan maken waarmee ik heel simpel een overzicht heb van een directory en daarbij bestanden kan toevoegen / downloaden / bekijken en bewerken.

Ik heb ook even getest of ik de config kan aanroepen echter krijg ik een blanco pagina terug. Dan lijken me de instellingen van de server wel goed te staan.

Pura Vida


  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

Dan moet je wel een config.php hebben he. als die er niet is vind die hem ook niet

Iperf


  • orf
  • Registratie: Augustus 2005
  • Laatst online: 09:39

orf

Waarschijnlijk wil je maar uit 1 map downloads toestaan (met eventueel submappen). Dat kun je doen door de meegegeven bestandsnaam te controleren met bijvoorbeeld een preg_match en met realpath() kun je kijken of er niet ergens geknoeid wordt met "../".

  • Rob
  • Registratie: Februari 2000
  • Niet online

Rob

fish schreef op zaterdag 11 januari 2014 @ 12:16:
wat probeer je nou te zeggen ?
Dat het ok is dat je vanuit je webserver met verkeerde code op plekken kan komen waar je niet hoort te komen? of ben je het met me eens ?

ik weet niet vanuit welk standpunt jij denkt maar een random gebruiker van een website hoort helemaal niet bij de configuratie van wat dan ook op die server te komen. en al helemaal niet bij de configuratie van de database verbinding.
Wat ik wil zeggen is dat je als programmeur van de 'domste eindgebruikers', slimste eindgebruikers en onveiligste servers moet uitgaan. Je moet er niet in je code van uitgaan dat de server 'toch niet bij alle mappen kan komen'

In the beginning the Internet was a bunch of smart users with dumb terminals. Now...


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Maverick2001 schreef op zaterdag 11 januari 2014 @ 14:10:
[...]
Er is inderdaad iets mis met de Tab! Dat is het probleem.

Verder is het meer even het testen van de mogelijkheden.
Voor testen moet je eerst beginnen met geen length header mee te geven.
Een length header zegt simpelweg tegen de browser : Zoveel bytes moet je opslaan, alles wat erna komt kan je negeren...
Dus als je ook maar 1 teken aan het begin toevoegt dan wordt je bestand op schijf (bij de meeste browsers) nog niet groter, er wordt gewoon 1 teken aan het einde afgekapt.

  • Maverick2001
  • Registratie: Februari 2001
  • Laatst online: 20-11 21:07

Maverick2001

Never look back

Topicstarter
orf schreef op zaterdag 11 januari 2014 @ 15:07:
Waarschijnlijk wil je maar uit 1 map downloads toestaan (met eventueel submappen). Dat kun je doen door de meegegeven bestandsnaam te controleren met bijvoorbeeld een preg_match en met realpath() kun je kijken of er niet ergens geknoeid wordt met "../".
Bedankt voor de tip! Met preg_match wordt het idd een stuk veiliger om binnen de download dir te blijven.

Pura Vida


  • Rob
  • Registratie: Februari 2000
  • Niet online

Rob

Maverick2001 schreef op zaterdag 11 januari 2014 @ 18:05:
[...]


Bedankt voor de tip! Met preg_match wordt het idd een stuk veiliger om binnen de download dir te blijven.
Als je alleen PDF en JPG wil laten downloaden, dan kun je de rest van de bestanden ook laten weigeren in je code

In the beginning the Internet was a bunch of smart users with dumb terminals. Now...


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Maverick2001 schreef op zaterdag 11 januari 2014 @ 18:05:
[...]


Bedankt voor de tip! Met preg_match wordt het idd een stuk veiliger om binnen de download dir te blijven.
preg_match is duur en over het algemeen onoverzichtelijk (checken op ../ is zinloos, dan laat je nog ./../ door, daarnaast heb je nog alle encodings waarin een slash kan staan etc)

Blacklisten op een FileSystem is gewoon een slecht idee (je moet alle vormen die je FileSystem accepteert gaan afvangen en dat zijn er nogal wat over het algemeen)

Je moet gewoon gaan whitelisten en dit kan nog steeds dynamisch door bijv server-side een whitelist op te bouwen uit alle files in een bepaalde dir-structuur

Blacklisten wil je alleen maar als je totaal geen idee hebt wat er is toegestaam, maar als je dat binnen je eigen scripts voor elkaar krijgt dan heb je hele andere problemen.

  • Maverick2001
  • Registratie: Februari 2001
  • Laatst online: 20-11 21:07

Maverick2001

Never look back

Topicstarter
Maar als je weet in welke directory de bestanden staan dan kan je toch wel met preg_match de rest afvangen.

Pura Vida


  • Miyamoto
  • Registratie: Februari 2009
  • Laatst online: 20-11 21:15
Nee, zoals Gomez12 zegt: Enkel whitelisten, niet blacklisten.

CKFinder is trouwens ook een mooie FileManager mocht je er toch een nodig hebben.

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Maverick2001 schreef op zaterdag 11 januari 2014 @ 18:59:
Maar als je weet in welke directory de bestanden staan dan kan je toch wel met preg_match de rest afvangen.
Geef eens een voorbeeldje van zo'n regex dan? (Die dus alle, maar dan ook echt alle verschijningsvormen tegenhoud)

Het nadeel van blacklisten is simpelweg dat je meer doorlaat dan nodig is en dat je er dan op vertrouwt dat een ander system (in dit geval je webserver/OS) magischerwijs wel gaat uitvinden wat jij wel/niet tegenhouden wil hebben.

Geef eens 1 goede reden waarom je meer toestaat dan noodzakelijk en daarna vertrouwt op magie die je bestanden moet beschermen.
Terwijl je gewoon heel simpel een whitelist kan opbouwen (gooi een filelisting van de toegestane files in een array en doe dan in in_array check et voila. je hebt voor dit gedeelte een 100% beveiliging ipv een twijfelachtige...)
Pagina: 1