15. marts 2005 - 11:55Der er
24 kommentarer og 1 løsning
tjekke om en fil er jpeg, mac og pc
Hej Jeg bruger dette uploadscript: //filupload - variabler $filtype = ".jpg"; $filnavn = time(); $uploaddir = '../kalender_billeder/'; $error = "kunne ikke uploade billedet"; //uploader $uploadfile = $uploaddir . $filnavn . $filtype; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { } else { print "$error"; die; } men jeg vil gerne tjekke om filen er et jpg billede, får jeg uploader det, hvordan gør jeg det lettest? Den skal både tjekke om det er jpg til mac (images/jpeg) og pc (images/pjpeg).
Det er så ikke nødvendigt, du kan blot gøre sådan:
if ( ( $info = @getimagesize( $filnavn ) ) !== false ) { if ( preg_match( '-image/p?jpeg-', $info['mime'] ) ) { // billedet er gyldigt og er af typen (p)jpeg } else { // Det er et billede, men ikke et (p)jpeg } } else { // Det er ikke et billede }
coderdk: Nu er det muligt at snyde med hensyn til hvilken Mimetype der angives og hvorfor dog undersøge extension? Jeg kan sagtens have et billede hvis extension ikke stemmer overens med hvad man normalt regner med at være JPEG extension.
Den eneste måde man kan være sikker på, hvilken type en fil har er ved rent faktisk at undersøge indholdet, ligesom file gør.
bromer, Nej du kan ikke snyde (rigtigt) med mime typen med getimagesize - Den loader billedet, så du får kun image/jpeg hvis den kan loade billedet som et jpeg. Man bør checke extension hvis man gemmer med samme extension, f.eks. kan jeg sende en php-fil med image/jpeg mime-typen.
bromer, Jeg mente bare at tidligere kunne man konkatenere et billede og en jpeg, og getimagesize ville godtage det - Men hvis du så kaldte det ville koden blive kørt - Men jeg har lige testet og det kan man heldigvis ikke længere :) getimagesize() fejler i min test hvis du har prøvet at narre den ;-) Så extensiontest er ikke nødvendig!
coder.dk har helt ret. Hvis du får uplodet noget med mime-type som billede, som som getimagesize eller tilsvarende siger er et billede, men som har extension .php, så kan det billede sagtens indeholde PHP-kode, der så kan udføres. Billedet bliver måske lagt i en mappe, der er direkte tilgængelig, og så har du tilladt fremmede at uploade scripts til din server. Det er ikke godt. Du kommer *ikke* udenom også at checke extension.
men hvordan pokker kan getimagesize så retunere at det er et okay billede? Det er jo et problem hvis funktionen udelukkende ser på Mimetypen og ikke på om billedet rent faktisk er gyldigt.
Derudover kan man jo altså lægge sine billeder et sted hvor man ikke kan ramme dem udefra. Så behøver man ikke at undersøge extension...
Det er klart at det ikke er et problem at undersøge extension, men jeg holder virkelig fast i troen om at det ikke er nødvendigt.
For det første kan filer som umiddelbart ikke kan "rammes" udefra vel godt bruges idet PHP kan finde dem. Eventuelt kan man jo lave et display script der viser billederne.
Derudover var jeg rent faktisk i den tro at file lavede et bedre valideringsarbejde end kun at undersøge start-bytes.
Ja, du sagtens servere "skjulte" billeder vha et PHP-script. Men det er ikke sikkert du altid kan og vil belaste serveren ekstra, så en dag laver du det om, eller tager en kopi til andet formål, og så er der ikke check for extension, og så har du et hul.
Jeg er sådan set ligeglad - det er bare et godt råd for at undgå bøvl.
Og så kunne det være interessant at se hvor mange af de store sites man kan snyde på den måde - men det er jo hacking, så det er bestemt ikke en opfordring... ;)
Det var nu ikke fordi jeg ikke selv ville undersøge extension, men derfor kan man jo godt (for debatens skyld) være lidt på tværs.
Og jeg synes generelt der er rigtig mange sites der har været ofre for SQL-injections og andre mindre heldige huller. Mon ikke der også er en del man kan fucke på denne måde :)
Jeg har som sagt lige testet ved at konkatenere et jpegbillede og noget phpkode, den ville getimagesize() ikke godtage - så jeg antager at det problem der har været ikke er der længere, og at man dermed kan undgå at teste på extension - Men det kan aldrig skade jo :)
Man kunne skrive en valideringsfunktion som undersøgte at der var tale om et jpeg billede hele vejen igennem :) Men det er nok at skyde en smule over målet.
Du kan intet konkludere ud fra det eksperiment. Du har prøvet een, ganske vist, oplagt ting, og det virker så ikke. Tror du ikke, der er andre muligheder, og tror du at en hacker giver op så let? Du forsøger vel ikke at lave sikre websites i dit arbejde eller din fritid ;) ?
øh, jeg siger tak.. jeg er ikke helt med på alle detaljerne i jeres diskution, men jeg bruger coder.dk's kode, så jeg giver point'sne til ham..
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.