MIME-type bepalen

Door R. Hebing, 16 jaar geleden, 6.816x bekeken

Dit script probeert aan de hand van de eerste byte sequences van een bestand het MIME-type te bepalen. Handig om te verifieren of de browser van de client het juiste MIME-type geeft aan een HTTP upload of om te controleren of er niet met het te uploaden bestand is geknoeid. Dit script bepaalt het MIME-type van de meest gangbare afbeeldingsformaten. Mocht je zelf MIME-typen willen toevoegen, zie dan het magic.mime bestand bij je webserver of PHP-distributie voor de correcte types en byte sequences.

Gesponsorde koppelingen

PHP script bestanden

  1. mimetype-bepalen

 

Er zijn 14 reacties op 'Mimetype bepalen'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Steven Prins
Steven Prins
16 jaar geleden
 
0 +1 -0 -1
lol
Zero Dead
Zero Dead
16 jaar geleden
 
0 +1 -0 -1
Hij geeft altijd:

Onbekend MIME-type

Bij .jpg bestanden Ö

Voor de rest een leuk script!:)
Jan Koehoorn
Jan Koehoorn
16 jaar geleden
 
0 +1 -0 -1
Normaal gesproken kun je het MIME type toch gewoon opvragen via:
$_FILES['userfile']['type']?

Of is die niet altijd betrouwbaar?
R. Hebing
R. Hebing
16 jaar geleden
 
0 +1 -0 -1
Daar heeft u gelijk in. Nadeel is echter wel dat deze waarde door de browser is opgegeven, waardoor er aan de clientkant met het MIME-type kan worden geknoeid. Ik heb geprobeerd om hiervoor een server sided oplossing te vinden. Na het bestuderen van enkele RFC's ben ik hiertoe gekomen. Alhoewel ik de byte sequences uit het magic.mime bestand van PHP heb gehaald, zou het goed mogelijk kunnen zijn dat bepaalde MIME-typen die in het script gespecificeerd zijn niet worden geidentificeerd omdat niet alle applicaties deze sequences gebruiken bij de opslag van een dergelijk bestand. Echt 100% betrouwbaar is deze methode dus ook niet.
R. Hebing
R. Hebing
16 jaar geleden
 
0 +1 -0 -1
ZeRoDeaD, klopt. Ik heb het nog een keer geprobeerd. Ik heb het patroon verbeterd en zelf op een aantal afbeeldingen getest. Bij mij werkte het dus het zou elders nu ook moeten werken.


16 jaar geleden
 
0 +1 -0 -1
wat kan je er eigenlijk mee want ik snap het niet goed
R. Hebing
R. Hebing
16 jaar geleden
 
0 +1 -0 -1
MIME staat voor Multipurpose Internet Mail Extensions. Deze standaard is bedoeld om de structuur van over het internet uit te wisselen data vast te leggen. Concreet kun je je bij data gewoon een bestand voorstellen. Een MIME-type vertelt met wat voor bestand je te maken hebt. Dit is noodzakelijk om het bestand op de juiste manier te verwerken. Als je bijvoorbeeld in je HTTP-browser een uit een database gehaalde afbeelding wilt bekijken moet de browser van tevoren weten dat de toe te sturen data van het type image/jpeg of dergelijk is om het correct aan jou te kunnen tonen (als de browser er bijvoorbeeld vanuit gaat dat de afbeelding tekst of html is, dan krijg je de afbeelding als tekst gepresenteerd (gekke tekentjes dus). Ik hoop dat het zo duidelijk is.


16 jaar geleden
 
0 +1 -0 -1
ja het is redelijk duidelijk maar als ik het lees is het niet echt makelijk die MIME ?
Willem Jan Z
Willem Jan Z
16 jaar geleden
 
0 +1 -0 -1
Misschien iets meer in leken taal:
Quote:
Wikipedia
De Multipurpose Internet Mail Extensions (meestal afgekort tot MIME) vormen een internetstandaard voor e-mail. MIME legt de structuur en codering van e-mailberichten vast. Het wordt ook gebruikt voor enkele andere manieren van communicatie over internet.


16 jaar geleden
 
0 +1 -0 -1
ah ja nu heb ik het helemaal gewoon de definitie van de codereing van een email of ander internet verkeer

allé dat weet ik dan ook weer :p
Derk nvt
Derk nvt
16 jaar geleden
 
0 +1 -0 -1
als je een algemene file uploader hebt moet je hier niet volledig op vertrouwen. Ik was namenlijk in staat een PHP bestand te maken die het script als PNG ziet. Controleer daarom ook gewoon op de extensie als je dit script gaat gebruiken, dat men geen .php plaatjes kan uploaden.

Met een MIME kan je aangeven wat voor soort bestand iets is. Ik geloof dat dit een idee van linux was.
Henk
Henk
15 jaar geleden
 
0 +1 -0 -1
Beste R. Hebing,

Hoe kan ik hiermee nog meer MIME-types aan toevoegen? Ik wil graag behalve bmp, png, jpg, en gif ook nog de volgende extensies en MIME-types kunnen controleren, maar ik weet niet hoe ik dit zou kunnen doen.

.html, .htm, .css, .php en .js

Alvast bedankt

En nog een opmerking: je doet
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    fclose($handle);
?>
nadat je al iets hebt gereturned in de functie. Die fclose zal dus nooit worden uitgevoerd. Gewoon voor de switch plaatsen en dan is het opgelost.
ChrisB
ChrisB
15 jaar geleden
 
0 +1 -0 -1
@derk

Derk, odnanks dat ik je begrijp met je standpunt om niet volledig te vertrouwen op het MIME type, vind ik je reactie wat naief. de extensie hoeft namelijk nietes over de inhoud te zeggen. Dit is typisch iets van Windows om te gebruiken. Vertrouwen op bestandsextensies is namelijk heel erg gevaarlijk en geeft een gigantisch beveiligingslek in je script.

Om het hele probleem te vehelpen kun je wellicht gebruik maken van een PECL extensie, Fileinfo -> http://pecl.php.net/File_Info.

Deze extensie kijkt naar byte sequences in het bestand zelf en bepaalt zo het type bestand. Hiermee kun je dus geen truukjes meer uithalen door het bestand te hernoemen en zo toch te uploaden. Hierna kun je de beveiliging vergroten door alsnog op extensie te controleren en te weigeneren als deze niet overeenkomen met het gevonden MIME-type.

MIME is overigens geen idee van Linux, maar is geintroduceerd om email berichten (en bijlages) te classificeren.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Hendricus
Hendricus
15 jaar geleden
 
0 +1 -0 -1
Hoi allemaal,

Kwam deze post tegen op zoek naar een manier om de MIME type van een file te achterhalen. Leuk script, maar als het alleen om images gaat waarom gebruik je dan niet: getimagesize()

$size = getimagesize("image.jpg");
echo $size["mime"];
// resulteerd in: image/jpeg

Ik zou graag de MIME achterhalen van allerlei file types.

mime_content_type() zou leuk zijn ware het niet dat het depreceated is en bovendien een optionele extensie is waardoor 9 v/d 10 hosting providers het niet geinstalleerd hebben.

Met PEAR/PECL zou je het volgende kunnen doen:
$handle = finfo_open(FILEINFO_MIME);
$mime_type = finfo_file($handle,"data.xls");
Maar totdat iedereen op PHP6 zit blijft dit ook optioneel...

Als je op Unix zit kun je dit proberen:
return trim( exec("file -bi " . escapeshellarg ( $file ) ) );

Maargoed, niet iedereen zit op een Unix server of een server waar men zelf extensies kan installeren. Conclusie: PHP komt zwaar tekort wat betreft MIME detectie!

@Henk; als je meerdere MIME types wilt toevoegen moet je dus ook weten naar welke sequence je op zoek bent. Je zou jezelf eens moeten verdiepen in 'magic numbers'. Dit is ook interessant: http://en.wikipedia.org/wiki/File_format

Met de getID3 class kun je vrij veel MIME types achterhalen maar ik vind het een behoorlijke class voor iets wat veel simpeler moet kunnen.

In ieder geval, het is absoluut geen makkie om een OS independent script te schrijven waarmee je met enige zekerheid een MIME type kunt achterhalen, eigenlijk is het gewoon niet mogelijk.

Of weet iemand iets dat ik niet weet? Dat zou heel goed kunnen natuurlijk :p

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. mimetype-bepalen

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.