Képfeltöltés, valódi mime lekérdezése
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.
■ 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.
magic mime
Valami nem koser
A bongeszo altal kuldott informaciokban meg ne bizzal meg. Nezzel magic numbert, azzal egy fokkal biztosabb a file tipus ellenorzes
getimagesize
Hibás jpg
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:
Norbi
$_FILES mime = getimagesize mime
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ó.
file --mime