Como saber se um arquivo de imagem REALMENTE é um arquivo de imagem?

Olá,

estou com a seguinte dúvida: temos um sistema no qual o usuario faz o upload de alguns arquivos de imagem (que podem ser de diversos formatos).

A maneira mais ingênua de saber se trata-se realmente de um arquivo de imagem consiste em verificar sua extensão. No entanto, nada impede que um usuario mal intencionado pegue por exemplo um arquivo executável, mude sua extensão e faça o upload do arquivo para o sistema.

Sendo assim, pergunto: há alguma maneira segura de se verificar se o conteudo do arquivo realmente é uma imagem, e não um arquivo de outro formato? Em caso afirmativo, como devemos proceder?

Google search: read image metadata java
http://johnbokma.com/java/obtaining-image-metadata.html
http://www.drewnoakes.com/code/exif/
http://schmidt.devlib.org/ffident/index.html
http://schmidt.devlib.org/image-info/
http://schmidt.devlib.org/java/pixel-image-io-libraries.html
http://java.sun.com/javase/6/docs/api/javax/imageio/ImageReader.html
http://www.shareit.com/product.html?productid=300033944

e mais aproximadamente 963.000 resultados.

Até!

Nunca testei, mas creio que dê para vocêtentar carregar a imagem, com o ImageIO read, e esperar por uma exceção caso o arquivo seja inválido…

Um outro formato que pode dar problema, é o SVG. Se for ter que aceitar todo e qualquer tipo de imagem, creio que você terá bastante trabalho para filtrar o que é útil ou não.

Até!

no meu caso são apenas os formatos de imagem que normalmente são utilizados em aplicações web.

Valeu pela ajuda gente!

[quote=kicolobo]no meu caso são apenas os formatos de imagem que normalmente são utilizados em aplicações web.
…[/quote]
Só uma curiosidade, que formatos são esses?
Já vi colocarem:
-Jpeg e derivados;
-Gif;
-Png;
-Svg;
-Tiff;
-Bmp;
-Pcx;
-Raw;
-Ps;

Não é um número pequeno. Se for só o trio do mal(PNG/JPEG/GIF) não vais ter muito problema.

Até!

É, se fosse implementar sem ajuda de API…Teria que ler a imagem e comparar seu cabeçalho com o padrão de cada formato que você espera receber…E isso é meio sacal :wink:

Na real é isso que a API faz, e qdo ela lê um arquivo cujo cabeçalho não corresponde ao formato esperado, ela joga uma exceção…