ugrás a tartalomhoz

Képfeltöltés, valódi mime lekérdezése

Thom · 2008. Feb. 17. (V), 01.33
Egy képfeltöltős működésben user hibajelzés során futottam bele a problémába.

Az alábbi ellenőrzéseket végzem:
- a $_FILES tömbből megnézem a fájl kiterjeszést, csak az elvárt (.jpg) lehet,
- a $_FILES tömbből nézem a böngésző által küldött mime típust csak az elvárt lehet,
- összevetem a $_FILES és a temp. képfájlról getimagesize() által kapott mime típusokat, egyezniük kell,
- és a további ellenőrzések...

Képfeltöltési hibát jeleztek, a hibás képfájlból nem jött létre tumbkép sem. A fájlt megnyitva az egy szokvány weboldal forrása volt jpg kiterjesztésű fájlban.
A hiba vizsgálata során magam lementettem az editorban egy html oldalt test.jpg néven, ezt feltöltve a $_FILES tömbben image/jpeg volt és a getimagesize() fv. is ezt adta vissza a temp képre. Így a fenti szűrések ki vannak játszva, azaz biztonsági rés maradt, csak az nem tölt fel hekkelt "képet", ami nem akar.

Kérdésem:
Hogyan lehet egy feltöltött fájlről megbízhatóan megtudni a mime típusát - azaz, hogy valóban képfájlról (jpg, gif, vagy png) van-e szó?

Utánanéztem, itt találtam megoldást de a szükséges PHP függvények (PECL) nincsenek mindig ott a tárhelyeken.
Másik megoldásként az exif_imagetype() fv-t ajánlják, de ez sem érhető mindenhol el.
Egyelőre gyorsjavítást végeztem - a helyére másolás után a fájlt kiolvasva keresek benne html, vagy script kódokra jellemző stringrészeket - de ez suszter megoldás.

Köszönettel várom a tippeket, ill. az ötletadó linkeket.
 
1

magic mime

Ronyn · 2008. Feb. 17. (V), 10.16
mime_content_type,hasonlo a fileinfohoz
2

Valami nem koser

zmb · 2008. Feb. 17. (V), 10.17
Szerintem valamit elrontottal. Ha nem jpeg, akkor a getimagesize false-t ad vissza.

A bongeszo altal kuldott informaciokban meg ne bizzal meg. Nezzel magic numbert, azzal egy fokkal biztosabb a file tipus ellenorzes
3

getimagesize

vbence · 2008. Feb. 17. (V), 10.20
Folytatnám a gondolatmenetedetet: mi van a getimagesize többi paraméterében? - Nehezen tudnám elképzelni, hogy szélességet és magasságot is kreál a html fájlodnak. Egy bizonyos méret alatt amúgy sem célserű engedélyezni a feltöltést.
4

Hibás jpg

N0r3i · 2008. Feb. 17. (V), 11.50
Szia!

Egyetértek az előttem szólókkal, a getimagesize() nem adhat helyes értéket. Viszont belefutottam egy sokkal kellemetlenebb problémába: hibás/sérült jpg fájl feltöltése esetén a fenti függvény időnként lefagy.
Ennek kiküszöbölésére találtam egy kis kódocskát, ez is jó szolgálatot tehet:

	//# [070203]
	//# check for jpeg file header and footer - also try to fix it
	function check_jpeg($f, $fix=false ){
	   if ( false !== (@$fd = fopen($f, 'r+b' )) ){
		   if (fread($fd,2)==chr(255).chr(216) ){
			   fseek ( $fd, -2, SEEK_END );
			   if ( fread($fd,2)==chr(255).chr(217) ){
				   fclose($fd);
				   return true;
			   }else{
				   if ($fix && fwrite($fd,chr(255).chr(217)) ){
					   fclose($fd);
					   return true;
				   }                   
				   fclose($fd);
				   return false;
			   }
		   } else {
			   fclose($fd);
			   return false;
		   }
	   } else {
		   return false;
	   }
	}
A függvény utasítható, hogy ha talál hibát, azt javítsa is, illetve visszatérési értékként jelzi, hogy rendben van-e a fájl. Ezt hosszá tenném az ellenőrzési listához.

Norbi
5

$_FILES mime = getimagesize mime

Thom · 2008. Feb. 17. (V), 14.19
Köszönöm a hozzászólásokat.
A hibás fájlt vizsgálva nekem tegnap éjjel getimagesize() image/jpeg -et adott, azért is írtam, de ma nem tudtam ugyanezt reprodukálni. Így csak az lehet, hogy az éjjeli órán valamit elnézhettem.
Most tehát úgy hagytam, hogy a fenti ellenőrzések benne vannak, tehát nézem a $_FILES tömbben érkező és a getimagesize által látott mime-t. Ha nem érkezik a böngészőből mime, akkor is inkább eldobom a fájlt, abból nagy baj nem lehet.
Ennek alapján próbálgatni fogom még magamat meghekkelni, ha találok valami érdemlegeset, azzal folytatni fogom ezt a topicot.
N0r3i: tesztelem a csekkoló kódot, bár nem tudom, mi múlik a jpeg-ben az első 2 karakteren. Ha beválik, köszönettel felhasználom.

Kiegészítés:
a $_FILES[type] és a getimagesize() által visszaadott mime adatok azonossága helyett azt kell nézni, hogy mindkettő benne van-e a lehetséges mime típusok listájában, mert volt olyan, amikor az egyik image/pjpeg, a másik image/jpg -t ad vissza - ez nem azonos ugyan, de elfogadható.
6

file --mime

drifter · 2008. Feb. 18. (H), 13.13
Még egy ötlet: ha unix rendszer és van shell hozzáférésed, `file --mime xyz.jpg` megadja a felismert MIME típust.