Controleren of file afbeelding is
Gewijzigd op 20/09/2010 21:34:04 door Pim -
Ik zeg dat het niet altijd veilig is
In welke situaties niet dan?
doordat mensen bijvoorbeeld evil.php.jpg uploaden Pim.
Ja maar dat wordt toch nooit door PHP geïnterpreteerd en is dus toch ongevaarlijk?
Het maak niet uit wat voor extensie een bestand heeft - in een file kan php code verborgen zitten -. Je dient stil te staan bij het feit dat men z'n file kan uploaden en dat met een hack die file wel degelijke door de php parser gehaald kan worden, met alle gevolgen van dien.
Maar dan ben je afhankelijk van andere zwakheden in het systeem. Op zich is php code in een afbeelding toch niet erg?
Wat ben jij koppig zeg. Natuurlijk is het niet echt dat je een bestand upload met vieze php code erin upload. Je website is immer waterdicht en dat bestand zal nooit door een andere hack benaderd kunnen worden.
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
27
28
29
30
31
32
33
34
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
<?php
$extensies = array('jpg','jpeg','gif','bmp');
if($_SERVER['REQUEST_METHOD'] == 'POST') {
if(trim($_FILES['bestand']['name']) != '') {
$extensie = pathinfo($_FILES['bestand']['name'], PATHINFO_EXTENSION);
$tijdelijk_bestand = $_FILES['bestand']['tmp_name'];
if(!in_array($extensie,$extensies)) {
echo 'Het bestand heeft niet de juiste extensie!';
} elseif(!getimagesize($tijdelijk_bestand)) {
echo 'Het is geen afbeelding!';
} else {
echo 'Alles ok';
}
} else {
echo 'Geen bestand geselecteerd!';
}
}
?>
$extensies = array('jpg','jpeg','gif','bmp');
if($_SERVER['REQUEST_METHOD'] == 'POST') {
if(trim($_FILES['bestand']['name']) != '') {
$extensie = pathinfo($_FILES['bestand']['name'], PATHINFO_EXTENSION);
$tijdelijk_bestand = $_FILES['bestand']['tmp_name'];
if(!in_array($extensie,$extensies)) {
echo 'Het bestand heeft niet de juiste extensie!';
} elseif(!getimagesize($tijdelijk_bestand)) {
echo 'Het is geen afbeelding!';
} else {
echo 'Alles ok';
}
} else {
echo 'Geen bestand geselecteerd!';
}
}
?>
Gewijzigd op 20/09/2010 21:38:04 door Arjan -
Wat worden we toch weer fijn snel persoonlijk...
jongens, blijf rustig. Neem eens een glas melk en komt tot rust
Ik was slechts nieuwsgierig waarom deze voorzorgsmaatregelen nodig zijn.
Hierdoor krijg je een niet werkende afbeelding en zullen er dus foutmeldingen (server side en / of client side) ontstaan, en dit wil je niet.
Met getimagesize kan je controleren of het een geldige afbeelding is (dit is niet 100% waterdicht, maar het komt er wel dichtbij in de buurt). Wanneer deze false teruggeeft weet je 99% zeker dat het geen afbeelding is (wel is het aan te raden om getimagesize alleen lokaal te gebruiken aangezien sommige websites hotlinking, etc. hebben uitgeschakeld).
En een bestand door de php parser halen (wat overigens volgens mij helemaal niet gebeurd) zal je extensie niet corrigeren.
Gewijzigd op 20/09/2010 21:43:59 door Arjan -
Verder was er vroeger wel een bug dat gif bestanden wél werden geparst door de php interperter. Je kunt dus nooit voorzichtig genoeg zijn.
Aah, het verschil tussen AddHandler en AddType in Apache. De ene voert PHP op alle bestanden uit ongeacht de extensie die je opgeeft, de ander houdt zich wel aan die extensie. Die ene is een feestje met jpeg plaatjes met PHP code in de mime attributen >:)
Kan je dat toelichten?
Dit script ging dan een kernel root exploit downloaden van een remote host, gelukkig kregen ze t script niet gedraaid en was de kernel up to date ;)
Hulde aan updates
Pim de Haan op 20/09/2010 22:51:32:
Kan je dat toelichten?
Het verschil tussen addtype en addhandler was volgens mij dat eentje ook uitgevoerd werd wanneer de php extensie die de laatste extensie in de bestandsnaam was. Bijvoorbeeld test.php.taart.jpg zou dan worden geparsed. Ik weet de details niet meer, maar kon nog wel iets opgoogelen.
Allemaal bedankt voor jullie hulp en meedenken :)