Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Java / mime type bepalen van PNG files

Pagina: 1
Acties:

  • smeerbartje
  • Registratie: September 2006
  • Laatst online: 10:43
Ik gebruik onderstaande code om de mime-type van files te bepalen. Dit werkt goed voor bijvoorbeeld jpg files (type is "image/jpeg"), maar voor png files krijg ik als mime-type terug: "application/octet-stream". Ik weet zeker dat m'n testfile een plaatje is, dus wat doe ik fout?

Zijn er sowieso betere methoden om van files te bepalen of het "media" is? Met media bedoel ik dus plaatjes (jpg, png, gif, etc), maar ook video (mp4, avi, etc).

Java:
1
2
3
4
5
6
7
8
// source: http://stackoverflow.com/questions/51438/getting-a-files-mime-type-in-java
String fileName = "/Users/rlommers/Downloads/CheckIfImage/image.png";
MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();

File file = new File(fileName);
String mimeType = mimeTypesMap.getContentType(file);

System.out.println("Mimetype: " + mimeType);

[ Voor 4% gewijzigd door smeerbartje op 12-04-2014 21:52 ]


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Je hebt kennelijk een javaomgeving waarbij png niet in mimetypes.default staat. http://stackoverflow.com/...s-to-mimetypesfiletypemap

Hier een versie met een regel voor png: http://code.google.com/p/...ava/mimetypes.default?r=3

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • smeerbartje
  • Registratie: September 2006
  • Laatst online: 10:43
Thanks; als ik 'm toevoeg, dan "ziet" hij inderdaad dat het een PNG is. Echter als ik een simpel tekstbestandje hernoem naar "test.jpg" of naar "test.png", dan denk hij ook dat dat respectievelijk een png of jpeg is. Ik wil dus eigenlijk iets hebben dat inhoudelijk naar de file kijkt en checkt of het een image/video betreft. Niet puur op extensie; want het lijkt erop dat mimTypesMap.getContentType() dat doet.

  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

Kan dan eens naar ImageIO. Daarmee kan je in elk geval bepalen of het een geldige afbeelding is, en ook wat voor type, onafhankelijk van de extensie.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

smeerbartje schreef op zaterdag 12 april 2014 @ 22:31:
Thanks; als ik 'm toevoeg, dan "ziet" hij inderdaad dat het een PNG is. Echter als ik een simpel tekstbestandje hernoem naar "test.jpg" of naar "test.png", dan denk hij ook dat dat respectievelijk een png of jpeg is. Ik wil dus eigenlijk iets hebben dat inhoudelijk naar de file kijkt en checkt of het een image/video betreft. Niet puur op extensie; want het lijkt erop dat mimTypesMap.getContentType() dat doet.
Dat klopt, want zo werkt dat nou eenmaal. Om voor elke file te gaan zitten uitvogelen wat 't is aan de hand van de inhoud zou een enorme performance-hit opleveren. Er wordt dus van uitgegaan dat de extensie, indien aanwezig, correct is.

Als je zelf wilt checken of een png file een png file is, de header van een PNG is heel simpel. De eerste bytes zijn als volgt:

code:
1
89504E470D0A1A0A

All my posts are provided as-is. They come with NO WARRANTY at all.


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Apache Tika zou dat wel kunnen. Voorbeeldcode op http://stackoverflow.com/...tifying-file-type-in-java

Maar de performance kan wel eens minder zijn natuurlijk, en bestanden horen gewoon de juiste extensies te hebben.. ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • smeerbartje
  • Registratie: September 2006
  • Laatst online: 10:43
Heb nu dit... en het werkt :). Ik zal Tika ook eens proberen.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   private static String getFormatName(Object o) {
      try {
         ImageInputStream iis = ImageIO.createImageInputStream(o);
         Iterator iter = ImageIO.getImageReaders(iis);
         if (!iter.hasNext()) {
            return null;
         }
         ImageReader reader = (ImageReader) iter.next();
         iis.close();

         return reader.getFormatName();
      } catch (IOException e) {
      }
      return null;
   }

[ Voor 3% gewijzigd door smeerbartje op 12-04-2014 23:26 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

CyBeR:
Dat klopt, want zo werkt dat nou eenmaal. Om voor elke file te gaan zitten uitvogelen wat 't is aan de hand van de inhoud zou een enorme performance-hit opleveren. Er wordt dus van uitgegaan dat de extensie, indien aanwezig, correct is.
Nou, liever niet eigenlijk. Ik mag hopen dat het met de betreffende library ook niet zo is. Als het inderdaad de extensie in ogenschouw neemt, kun je beter die library niet meer gebruiken.

Dit is wat mijn mime type guesser zegt (standaard GNU/Linux; Debian in dit geval):
$ wget -q http://tweakimg.net/g/if/v3/framework/logo_transparent.png
$ file ./logo_transparent.png 
./logo_transparent.png: PNG image data, 213 x 85, 8-bit/color RGBA, non-interlaced
$ mv logo_transparent.png foo.jpg
$ file ./foo.jpg 
./foo.jpg: PNG image data, 213 x 85, 8-bit/color RGBA, non-interlaced
$ mv foo.jpg bar.txt
$ file ./bar.txt 
./bar.txt: PNG image data, 213 x 85, 8-bit/color RGBA, non-interlaced

Die snapt t ook. En als je performance verkiest boven security moet je van hele goede huize komen ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

drm schreef op zondag 13 april 2014 @ 05:24:
[...]
Nou, liever niet eigenlijk. Ik mag hopen dat het met de betreffende library ook niet zo is. Als het inderdaad de extensie in ogenschouw neemt, kun je beter die library niet meer gebruiken.
Welkom in de echte wereld waar mime types 99 van de 100 keer gewoon op filenaam gaan.
Dit is wat mijn mime type guesser zegt (standaard GNU/Linux; Debian in dit geval):
$ wget -q http://tweakimg.net/g/if/v3/framework/logo_transparent.png
$ file ./logo_transparent.png 
./logo_transparent.png: PNG image data, 213 x 85, 8-bit/color RGBA, non-interlaced
$ mv logo_transparent.png foo.jpg
$ file ./foo.jpg 
./foo.jpg: PNG image data, 213 x 85, 8-bit/color RGBA, non-interlaced
$ mv foo.jpg bar.txt
$ file ./bar.txt 
./bar.txt: PNG image data, 213 x 85, 8-bit/color RGBA, non-interlaced

Die snapt t ook. En als je performance verkiest boven security moet je van hele goede huize komen ;)
'file' is helemaal geen mime type guesser; file is een file type guesser die inderdaad aan de hand van de inhoud en een grote magic database werkt. En dit heeft met security helemaal geen moer te maken. Sterker nog, er zijn best een paar security advisories met betrekking tot 'file' zelf, waar een verkeerde input 'file' rare dingen kon laten doen.

All my posts are provided as-is. They come with NO WARRANTY at all.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

CyBeR:
Welkom in de echte wereld waar mime types 99 van de 100 keer gewoon op filenaam gaan.
Dat het vaak gebeurt wil nog niet zeggen dat het een goed idee is.
'file' is helemaal geen mime type guesser; file is een file type guesser die inderdaad aan de hand van de inhoud en een grote magic database werkt.
Dat zijn twee compleet verschillende dingen, omdat ...?
En dit heeft met security helemaal geen moer te maken.
Het doen van aannames over de inhoud van een bestand op basis van zijn bestandsextensie heeft geen moer met security te maken ....? Ik weet niet wat ik hier op moet zeggen... als je dat echt gelooft dan hoop ik dat je nooit meer iemand een advies geeft over iets dat ook maar in de verste verte met security te maken heeft... Maar je bedoelt ongetwijfeld iets anders.
Sterker nog, er zijn best een paar security advisories met betrekking tot 'file' zelf, waar een verkeerde input 'file' rare dingen kon laten doen.
Ik weet niet wat dat met mijn punt te maken heeft, maar dat zal best.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

drm schreef op zondag 13 april 2014 @ 14:17:
[...]
Dat het vaak gebeurt wil nog niet zeggen dat het een goed idee is.
Dan gebruik jij toch lekker elke keer file om 't uit te zoeken? Moet je niet terug komen als je server staat te roken omdat 'ie het niet bijhoudt.
Dat zijn twee compleet verschillende dingen, omdat ...?
Komt er een MIME-type uit file? Nee.
Het doen van aannames over de inhoud van een bestand op basis van zijn bestandsextensie heeft geen moer met security te maken ....? Ik weet niet wat ik hier op moet zeggen... als je dat echt gelooft dan hoop ik dat je nooit meer iemand een advies geeft over iets dat ook maar in de verste verte met security te maken heeft... Maar je bedoelt ongetwijfeld iets anders.
Als je applicatie een securityprobleem heeft als je een image/jpeg file doorstuurt met een text/plain mime type dan is je applicatie brak. Server-side heeft dat echter geen enkele invloed op de beveiliging ervan.
[...]
Ik weet niet wat dat met mijn punt te maken heeft, maar dat zal best.
Op het moment dat je met de inhoud van user-input (files) bezig gaat, heb je het probleem dat je je juist openstelt voor security problemen. Bijvoorbeeld file wat meermaals in het verleden zo'n probleem gehad heeft, of een file die specifiek gemaakt is om het een te zijn maar voor dat soort guessers te lijken op iets anders.

Kijk, ik ga je niet tegenhouden als jij iets anders wilt doen maar neem van mij aan dat de industry practise is om dit gewoon op file extension te doen, en dat er in de meeste situaties geen reden is om dat niet te doen.

All my posts are provided as-is. They come with NO WARRANTY at all.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

CyBeR:
Dan gebruik jij toch lekker elke keer file om 't uit te zoeken? Moet je niet terug komen als je server staat te roken omdat 'ie het niet bijhoudt.
Again... performance over security?
Komt er een MIME-type uit file? Nee.
Met de juiste flags wel :z Een MIME type is alleen maar een representatie van een file type.
Als je applicatie een securityprobleem heeft als je een image/jpeg file doorstuurt met een text/plain mime type dan is je applicatie brak. Server-side heeft dat echter geen enkele invloed op de beveiliging ervan.
Tsja... zo zou de bouwer van de "applicatie" ook kunnen redeneren: meh, ik ga niet moeilijk doen want had de user input maar goed gevalideerd moeten zijn.... Met zo'n houding weet je zeker dat er ergens een gat in je systeem zit.
Op het moment dat je met de inhoud van user-input (files) bezig gaat, heb je het probleem dat je je juist openstelt voor security problemen. Bijvoorbeeld file wat meermaals in het verleden zo'n probleem gehad heeft, of een file die specifiek gemaakt is om het een te zijn maar voor dat soort guessers te lijken op iets anders.
Kortom: vertrouw userinput nooit. Hoe je dat dan precies regelt moet je zelf weten, maar een extensie is ook user input. Dat is precies mijn punt.
Kijk, ik ga je niet tegenhouden als jij iets anders wilt doen maar neem van mij aan dat de industry practise is om dit gewoon op file extension te doen, en dat er in de meeste situaties geen reden is om dat niet te doen.
Ik ga jou niet tegenhouden als je extensions wilt vertrouwen, maar als je beweert dat dat geen veiligheidsimplicaties heeft, vind ik dat een slecht advies.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Prima hoor.

All my posts are provided as-is. They come with NO WARRANTY at all.


  • Adion
  • Registratie: Januari 2001
  • Laatst online: 12:54
Ik ben nu toch wel benieuwd naar een voorbeeld van wanneer het onveilig zou zijn om het foute mime-type gegokt te hebben...

VirtualDJ 2024 - Fast Image Resizer - Instagram


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
drm schreef op zondag 13 april 2014 @ 16:50:
[...]
Again... performance over security?
Als je ongecontroleerd files in je file system, krijgt, dan maakt content sniffing vs extensie niets meer uit. Dan heb je grotere problemen.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

MSalters:
Als je ongecontroleerd files in je file system, krijgt, dan maakt content sniffing vs extensie niets meer uit. Dan heb je grotere problemen.
Prima, zo lang dan maar helder is waar die controle dan wél ligt.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • HollowGamer
  • Registratie: Februari 2009
  • Niet online
Waarom dump je niet in een file of tabel, wat voor een bestandstype bij die bestandsnaam hoort?
Zo kun je een schakel functie maken en hoef je server niet gaan 'gokken' welk bestandrype jij bedoeld en het scheelt weer load. ;)

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
HollowGamer schreef op dinsdag 15 april 2014 @ 01:24:
Waarom dump je niet in een file of tabel, wat voor een bestandstype bij die bestandsnaam hoort?
Zo kun je een schakel functie maken en hoef je server niet gaan 'gokken' welk bestandrype jij bedoeld en het scheelt weer load. ;)
Hoe wil je die file/tabel gaan vullen?

  • HollowGamer
  • Registratie: Februari 2009
  • Niet online
Is dit zo moeilijk dan?
Bestandsnaam|type
Fjsnssnsbddkenxbs|image/png

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
En wat gaat je dat meer opleveren t.o.v. de oplossing die de TS al in z'n openingspost had staan? Want dit is dus precies wat MimetypesFileTypeMap al doet o.b.v. de mimetypes.default file.

"Any sufficiently advanced technology is indistinguishable from magic."


  • begintmeta
  • Registratie: November 2001
  • Niet online

begintmeta

Moderator General Chat
drm schreef op zondag 13 april 2014 @ 16:50:
...
Kortom: vertrouw userinput nooit. Hoe je dat dan precies regelt moet je zelf weten, maar een extensie is ook user input. Dat is precies mijn punt.
...
De bestandsnaam is user input, de bestandsinhoud is user input, allebei dus niet te vertrouwen. Waar je op af gaat om het bestandstype te bepalen zou niet uit mogen maken.

[ Voor 9% gewijzigd door begintmeta op 15-04-2014 11:19 ]


  • HollowGamer
  • Registratie: Februari 2009
  • Niet online
Herko_ter_Horst schreef op dinsdag 15 april 2014 @ 11:03:
En wat gaat je dat meer opleveren t.o.v. de oplossing die de TS al in z'n openingspost had staan? Want dit is dus precies wat MimetypesFileTypeMap al doet o.b.v. de mimetypes.default file.
Omdat TS als opmerking maakte, wat als ik de extensie verander van .png naar .andere-ext?

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
HollowGamer schreef op dinsdag 15 april 2014 @ 13:48:
[...]

Omdat TS als opmerking maakte, wat als ik de extensie verander van .png naar .andere-ext?
Het is maar net de vraag of dat een probleem is. Enige wat je daardoor krijgt is dat images waarschijnlijk niet goed geladen worden. Aangezien dit opzet is, hoeft dat geen issue te zijn.

https://niels.nu


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
begintmeta schreef op dinsdag 15 april 2014 @ 11:18:
[...]
De bestandsnaam is user input, de bestandsinhoud is user input, allebei dus niet te vertrouwen.
De bestandsinhoud is user input en niet te vertrouwen? In welk model denk jij?

In een serveromgeving komt data pas op disk nadat het gecheckt is; er ontstaan niet spontaan .PNG files op disk.

In een client omgeving kun je dat niet afdwingen, maar hoef je user input ook niet te vertrouwen. Users kunnen alleen bij hun eigen files. Dit introduceert geen enkel nieuw risico.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • begintmeta
  • Registratie: November 2001
  • Niet online

begintmeta

Moderator General Chat
MSalters schreef op donderdag 17 april 2014 @ 17:23:
...
In een serveromgeving komt data pas op disk nadat het gecheckt is; er ontstaan niet spontaan .PNG files op disk.
...
Wat ik bedoel is dus dat je altijd voorzichtig moet zijn bij het checken van bestanden, omdat PNG-inhoud noch bestandsnamen vanzelf ontstaan (maar altijd (eventueel indirect) van een user afkomstig zijn)

[ Voor 11% gewijzigd door begintmeta op 17-04-2014 18:18 ]


  • smeerbartje
  • Registratie: September 2006
  • Laatst online: 10:43
Mensen, wat een discussie. Ik wil voorkomen dat kwaadwillenden (we hebben ook te maken met externe leveranciers) foutieve files aanleveren, onder de noemen: "het is een plaatje". Vandaar dat ik nu Apache TIKA gebruik om te bepalen of "iets" een media asset is. Werkt goed en de performance is goed genoeg. Alléén mime-type checking is voor ons té risico-vol, ook al is het sneller.

[ Voor 3% gewijzigd door smeerbartje op 17-04-2014 20:02 ]

Pagina: 1