[PHP] check of het wel ECHT een file betreft

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
Ik heb best lopen zoeken op GOT en GOOGLE, maar kan toch niet helemaal met zekerheid een antwoord vinden op mijn vraag.

Als er een bestand wordt ge-upload, hoe weet ik dan zeker dat die persoon niet gewoon een string invoerd van een niet bestaand bestand?
Ik kan ALS er een bestand is prima checken op extensie, grootte, filename, etc, maar niet of er nou WEL een bestand is zonder rare foutcode.

Werkt is_uploaded_file een goede methode om te kijken of er wel ECHT wat is upgeload?
Heb namelijk geen zin in een PHP error, liever een die ik zelf genereer.

Het klinkt simpel in mijn eigen oren, maar kan het niet vinden. :(

Daarnaast vraag ik me af hoe veilig het is om een jpg te uploaden bijvoorbeeld.
Als je deze gewoon direct in een DIR zet en het alleen met <img src= oproept, kan iemand toch nooit evil code uitvoeren op je server? :/

mijn naam slaat nergens op, althans niet op mij :P


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-09 14:28
1. Een exe wordt nooit uitgevoerd op je server als dit niet zo staat ingesteld. Dit is vaak alleen in het cgi-bin directory zo.
2. Een echt van een nep bestand onderscheiden kan misschien door te controleren of het een geldig mime-type is?

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Als er niks geupload is, dan komt het ook niet in je $_FILES-array.

'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!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
-NMe- schreef op maandag 14 februari 2005 @ 22:03:
Als er niks geupload is, dan komt het ook niet in je $_FILES-array.
dat is niet waar volgens mij. Een string komt gewoon in je $_FILES array te staan.
En dat is ook precies wat ik wil voorkomen, users die gewoon een string invullen.

mijn naam slaat nergens op, althans niet op mij :P


Acties:
  • 0 Henk 'm!

Verwijderd

Dat kan je nooit checken... Bovendien, als het wel zou kunnen, vult de kwaadwillende (?) gebruiker die string in in een bestandje, slaat die op en upload 'm naar je server.

Ik zie het probleem niet.

Acties:
  • 0 Henk 'm!

  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 23-07 18:19
(jarig!)
controleer op filesize zou ik zeggen :)

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
uhmm is_uploaded_file()?

edit:
Hmm, dat werkt idd niet. Als er alleen een string wordt ingegeven gaat die ook naar TRUE. Zit er dus niets anders op dan het checken van filesize, mimetype en dat soort zaken. Als het je gaat om het uitvogelen van plaatjes is getimagesize() wel een redelijke check.

[ Voor 66% gewijzigd door T-MOB op 15-02-2005 01:11 ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • xces
  • Registratie: Juli 2001
  • Laatst online: 20-09 16:56

xces

To got or not to got..

dat niet alleen, Sta alleen bepaalde extensies toe. (bijv. enkel jpg).

Verder kun je (om er zeker van te zijn dat de file niet executable zal worden)
--> chmod('filename', 0646)

Hierdoor is het een gewone file (0644), maar tevens overschrijfbaar etc. (vandaar de 6 op het einde).

[ Voor 8% gewijzigd door xces op 15-02-2005 01:07 ]


Acties:
  • 0 Henk 'm!

  • Anders
  • Registratie: December 2000
  • Laatst online: 13-09 18:52
Als je een string invoert, en geen echt bestand:

code:
1
2
3
4
5
6
7
8
9
10
11
12
Array
(
    [frmFileName] => Array
        (
            [name] => test.doc
            [type] => application/octet-stream
            [tmp_name] => /var/tmp/phpu8gTbR
            [error] => 0
            [size] => 0
        )

)


Kun je niet gewoon afgaan op die $_FILES[...]["size"] die 0 is?

Bij het uploaden van een afbeelding kun je controleren of het een afbeelding is met getimagesize()
If accessing the filename image is impossible, or if it isn't a valid picture, getimagesize() will return FALSE and generate a warning.
(--> wat T-MOB zei dus :) )

[ Voor 9% gewijzigd door Anders op 15-02-2005 02:02 ]

Ik spoor veilig of ik spoor niet.


Acties:
  • 0 Henk 'm!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
Ik dacht al zoiets ja.
Ik zal het idd met getimagesize() en filesize moeten doen.
$_FILES array moet dus grondig worden nagekeken en filesize moet minimaal 1Kb zijn, of > dan 0Kb. (kan de lengte gelukkig wel afvangen van eens string, dus daarmee is filesize eigenlijk superveilig :) )
file_extensie is natuurlijk ook nodig, maar een string bla.jpg komt daar prima doorheen.

Vinden jullie het niet vreemd dat er geen functie voor is die dat checkt?

mijn naam slaat nergens op, althans niet op mij :P


Acties:
  • 0 Henk 'm!

Verwijderd

De data controleren van het bestand!?
De laatste twee bytes van een JPG bestand moet 0xFFen 0xD9 (EOI) zijn!

Acties:
  • 0 Henk 'm!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
Maar je moet toch altijd streven naar een generieke oplossing die voor (bijna) alle bestanden geldt.
Wanneer je per filetype een (vage) check doet, blijf je bezig.
imo is filesize de beste oplossing tegen een string / niet bestaande file (ook string ;) )
Wanneer je daarna een extensiecheck doet en het bestand alleen maar aanroept via HTML,
(img bijv) kan er toch niks fout gaan?

mijn naam slaat nergens op, althans niet op mij :P


Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 22:05

pietje63

RTFM

Ik zal het uploaden van bijv php bestanden ook voorkomen :)

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Zoolander schreef op dinsdag 15 februari 2005 @ 09:50:
Maar je moet toch altijd streven naar een generieke oplossing die voor (bijna) alle bestanden geldt.
Wanneer je per filetype een (vage) check doet, blijf je bezig.
imo is filesize de beste oplossing tegen een string / niet bestaande file (ook string ;) )
Wanneer je daarna een extensiecheck doet en het bestand alleen maar aanroept via HTML,
(img bijv) kan er toch niks fout gaan?
Maar wat is het probleem met een string / een file van 0 bytes? Ongewenste code zit erdan iig niet in ;).

Checken zul je sowieso moeten doen omdat ik me niet kan voorstellen dat je alle typen files wil laten uploaden. Ook als je een bestand alleen aanroept in een <img> tag dan kan je server nog gehackt worden. Door bijvoorbeeld direct naar het bestand te surfen, of als je dat hebt uitgeschakeld een php script te uploaden dat een plaatje weergeeft, maar ook je /etc/passwd rondmailt of andere fancy grappen uithaalt. Controleer dus altijd of een upload van het type is dat je verwacht. Als je dat doet heb je ook geen last van mensen die strings invoeren.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
T-MOB schreef op dinsdag 15 februari 2005 @ 13:00:
[...]


Maar wat is het probleem met een string / een file van 0 bytes? Ongewenste code zit erdan iig niet in ;).

Checken zul je sowieso moeten doen omdat ik me niet kan voorstellen dat je alle typen files wil laten uploaden. Ook als je een bestand alleen aanroept in een <img> tag dan kan je server nog gehackt worden. Door bijvoorbeeld direct naar het bestand te surfen, of als je dat hebt uitgeschakeld een php script te uploaden dat een plaatje weergeeft, maar ook je /etc/passwd rondmailt of andere fancy grappen uithaalt. Controleer dus altijd of een upload van het type is dat je verwacht. Als je dat doet heb je ook geen last van mensen die strings invoeren.
Dat is ook wat ik bedoelde. Ik zie het nu zo:

1. check of er IETS is ingevult (indien verplicht)
2. check of illegal characters / string length
3. check of filesize > 0Kb
4. check op extensie

als alle checks ok zijn,
dan pas file naam geven, in map zetten, whatever.
Als het dan een JPG was met code erin ofzo, dan kan dat (met mijn beperkte kennis van security) geen kwaad als je het altijd via juiste HTML tag aanroept. (dus geen .jpg gaan includen ofzo :P )

mijn naam slaat nergens op, althans niet op mij :P


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Zoolander schreef op dinsdag 15 februari 2005 @ 14:07:
[...]


Dat is ook wat ik bedoelde. Ik zie het nu zo:

1. check of er IETS is ingevult (indien verplicht)
2. check of illegal characters / string length
3. check of filesize > 0Kb
4. check op extensie

als alle checks ok zijn,
dan pas file naam geven, in map zetten, whatever.
Als het dan een JPG was met code erin ofzo, dan kan dat (met mijn beperkte kennis van security) geen kwaad als je het altijd via juiste HTML tag aanroept. (dus geen .jpg gaan includen ofzo :P )
Een extensie is niet een veilige manier om het bestandstype te bepalen. Noem voor de grap eens een gewone html pagina op je webserver "pagina.jpg" en open hem met IE. Dan zie je wel wat ik bedoel. Voor plaatjes kun je beter iets als de volgende methode gebruiken:

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
// check of een bestand succesvol is geüpload en een plaatje is van 
// het type GIF, PNG of JPG
if ($_FILES['name']['error'] == 0 
   && $typetest = getimagesize($_FILES['name']['tmp_name'])
   && $typetest[2] <= 3)
{
  //bepaal de correctie extensie
  switch ($typetest[2])
  {
   case 1: $ext = 'gif';
    break;
   case 2: $ext = 'jpg';
    break;
   case 3: $ext = 'png';
  }

  //verzin een nieuwe naam
  $newname = createNewName() .'.' .$ext;

  //verplaats het bestand naar gewenset dir
  if (!move_uploaded_file($_FILES['tmp_name'], $dir .$newname)
  {
    //spuug een foutmelding
  }
} else {
  //spuug een foutmelding
}

[ Voor 6% gewijzigd door T-MOB op 15-02-2005 14:52 ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
Dus eigenlijk komt een PDF of een DOC nooit in aanmerking om veilig up te loaden?
Want zodra iemand binnen is op je server, kan hij al zijn sporen uitwissen.
Er moet toch wat zijn om generiek iets te checken, of moet je voor elk filetype een inhoudelijke check doen op danwel valid inhoud (is de file idd filetype) of illegal inhoud (zit er geen html, php of js oid in het bestand verwerkt)

mijn naam slaat nergens op, althans niet op mij :P


Acties:
  • 0 Henk 'm!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
Kan je een PDF veilig uploaden in PHP?
Iemand hier op GOT moet daar toch een beveiliging voor bedacht hebben, die best wel heel veilig is?
Of ben ik nu te goedgelovig? :P

mijn naam slaat nergens op, althans niet op mij :P


Verwijderd

Dit hele artikel is wel interessant (20 pagina's), maar hier twee die gaan over upload hacks /exploits:
http://www.phpfreakz.nl/artikelen.php?aid=106&page=12
http://www.phpfreakz.nl/artikelen.php?aid=106&page=13

En uitleg met wat je er tegen kunt doen natuurlijk :)
Pagina: 1