afbeeldingen downloaden werkt niet
Met dit script probeer ik afbeeldingen te downloaden, maar als ik ze open, krijg ik een foutmelding en worden ze niet weergegeven. Ik krijg alleen de melding "Dit bestand kan niet worden geopend.".
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
header ('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header ('Content-Description: File Transfer');
header ('Content-Type: application/octet-stream');
header ('Content-Length: ' . filesize(__DIR__ .'/opslag/'.$_GET['bestand']));
header('Content-Type: image/png');
header("Content-Disposition: attachment; filename=".$_GET['bestand']."");
?>
header ('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header ('Content-Description: File Transfer');
header ('Content-Type: application/octet-stream');
header ('Content-Length: ' . filesize(__DIR__ .'/opslag/'.$_GET['bestand']));
header('Content-Type: image/png');
header("Content-Disposition: attachment; filename=".$_GET['bestand']."");
?>
Waar is de inhoud van je bestand? Heb je dat voor het voorbeeld weggelaten of ben je het gewoon vergeten?
Ben van Velzen op 28/05/2016 13:23:41:
Waar is de inhoud van je bestand? Heb je dat voor het voorbeeld weggelaten of ben je het gewoon vergeten?
Dan is dat dus het probleem. :P
Hoe krijg ik de inhoud?
Het is overigens aan te bevelen om niet direct op de inhoud van $_GET['bestand'] te vertrouwen, het is in deze opzet een koud kunstje om ieder gewenst bestand op je systeem op te vragen. Bijvoorbeeld de inhoud van index.php, welke weer verwijst naar configuraties e.d.
Ben van Velzen op 28/05/2016 14:18:22:
Voeg dit eens toe:
Het is overigens aan te bevelen om niet direct op de inhoud van $_GET['bestand'] te vertrouwen, het is in deze opzet een koud kunstje om ieder gewenst bestand op je systeem op te vragen. Bijvoorbeeld de inhoud van index.php, welke weer verwijst naar configuraties e.d.
Het is overigens aan te bevelen om niet direct op de inhoud van $_GET['bestand'] te vertrouwen, het is in deze opzet een koud kunstje om ieder gewenst bestand op je systeem op te vragen. Bijvoorbeeld de inhoud van index.php, welke weer verwijst naar configuraties e.d.
Helaas. Inhoud blijft leeg.
zet je error reporting eens aan en haal de headers weg, wat krijg je dan?
Ben van Velzen op 28/05/2016 21:13:37:
zet je error reporting eens aan en haal de headers weg, wat krijg je dan?
Code (php)
1
Warning: fpassthru() expects parameter 1 to be resource, string given in /home/blablabla/domains/mijndomein.nl/public_html/upload/download.php on line 4
Ik neem aan, dat het gaat om dit stukje : '/opslag/'
Gewijzigd op 28/05/2016 23:05:21 door Marco Eilander
Marco Eilander op 28/05/2016 12:35:06:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . filesize(__DIR__ .'/opslag/'.$_GET['bestand']));
header('Content-Type: image/png');
header("Content-Disposition: attachment; filename=".$_GET['bestand']."");
?>
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . filesize(__DIR__ .'/opslag/'.$_GET['bestand']));
header('Content-Type: image/png');
header("Content-Disposition: attachment; filename=".$_GET['bestand']."");
?>
Bij de header 'Content-Length' zit het bestand in de map 'opslag'. Bij de header 'Content-Disposition' niet.
Code (php)
1
2
3
2
3
<?php
header("Content-Disposition: attachment; filename=".__DIR__ ."/opslag/".$_GET['bestand']."");
?>
header("Content-Disposition: attachment; filename=".__DIR__ ."/opslag/".$_GET['bestand']."");
?>
Gewijzigd op 29/05/2016 12:11:13 door Joakim Broden
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . filesize(__DIR__ .'/opslag/'.$_GET['bestand']));
header('Content-Type: image/png');
header("Content-Disposition: attachment; filename=".$_GET['bestand']);
readfile(__DIR__ . '/opslag/' . $_GET['bestand']);
?>
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . filesize(__DIR__ .'/opslag/'.$_GET['bestand']));
header('Content-Type: image/png');
header("Content-Disposition: attachment; filename=".$_GET['bestand']);
readfile(__DIR__ . '/opslag/' . $_GET['bestand']);
?>
- in bestandsnamen kunnen spaties zitten, zet daartoe dubbele quotes om filename, oftewel:
- voeg een exit-statement aan het einde toe om te voorkomen dat er verder nog output geproduceerd wordt wat het bestand mogelijk kan corrumperen
Er komt nu wel data in het bestand te staan als ik het open, maar ik blijf de melding krijgen, dat het bestand niet geopend kan worden in de windows 10 app -> Foto's.
Dit heb ik nu:
Code (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
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
<?php
$filename = $_GET['bestand'];
$ext = explode(".",$filename);
if($ext[1] == 'png'){
header('Content-Type: image/png');
}
if($ext[1] == 'jpg'){
header('Content-Type: image/jpg');
}
if($ext[1] == 'jpeg'){
header('Content-Type: image/jpeg');
}
if($ext[1] == 'gif'){
header('Content-Type: image/gif');
}
if($ext[1] == 'bmp'){
header('Content-Type: image/bmp');
}
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . filesize(__DIR__ .'/opslag/'.$filename));
header('Content-Disposition: attachment; filename="'.$filename.'"');
readfile(__DIR__ . '/opslag/' . $filename);
exit();
?>
$filename = $_GET['bestand'];
$ext = explode(".",$filename);
if($ext[1] == 'png'){
header('Content-Type: image/png');
}
if($ext[1] == 'jpg'){
header('Content-Type: image/jpg');
}
if($ext[1] == 'jpeg'){
header('Content-Type: image/jpeg');
}
if($ext[1] == 'gif'){
header('Content-Type: image/gif');
}
if($ext[1] == 'bmp'){
header('Content-Type: image/bmp');
}
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . filesize(__DIR__ .'/opslag/'.$filename));
header('Content-Disposition: attachment; filename="'.$filename.'"');
readfile(__DIR__ . '/opslag/' . $filename);
exit();
?>
UPDATE
Ik had notepad++ op UTF-8 staan, nu ik het op ANSI heb gezet, werkt het! :)
Gewijzigd op 29/05/2016 18:39:06 door Marco Eilander
Code (php)
En wat als je foto nu dit.is.een.test.jpg heet, wat een volledig valide naam is?
De extensie van een bestand is doorgaans alles wat na de laatste punt in de bestandsnaam komt.
Mogelijke verbetering, gebruik:
Alle bestanden worden opgeslagen met een willekeurig reeks karakters a-z, A-Z, 0-9 in mijn database.
Mogelijkheid om die bestanden van naam te veranderen is niet mogelijk.
De mogelijkheid om een andere bestandsnaam op te vragen blijft er altijd, en daarmee blijft het gevaarlijk om het zo te doen.
Daarnaast wordt er ook nog gecontroleerd voor het downloaden, of het bestand wel bestaat, zo niet, dan worden ze doorgestuurd naar de index.
Kort gezegd, als je op deze manier werkt gaat het vroeg of laat helemaal fout, en als je betalende klanten hebt gaat geen aansprakelijkheidsverzekering je nog redden. Je bouwt nu tegen beter weten in een hele mooie backdoor in.
Gewijzigd op 30/05/2016 14:06:23 door Ben van Velzen