Segurança: como validar os carregamentos de arquivos de imagem?

Eu preciso aceitar as transferências de arquivos de imagem dos usuários.

Como posso verificar e ter 100% de certeza de que não recebo um arquivo malicioso ou algo assim?

Verifique o tipo mime? Re-desenhar a imagem? Anti-vírus?

Redraque a imagem, lê-la com o imagecreatefromXXX() GD e salve-o de volta com imageXXX()

Desta forma, você também pode escalá-lo para tamanhos mais convenientes e manter o consumo de largura de banda sob controle.

Para economizar em poder de computação, recuse upload para arquivos maiores que um determinado limite.

5megs ou 10megs devem estar bem, já que os limites vão.

Mantenha o GD atualizado e tenha cuidado com isso (7 anos atrás, aparentemente) , costumava desbordar o buffer no manuseio de imagens PNG

Alternativamente, você também pode processar imagens carregadas em segundo plano com comandos como o Convert da ImageMagick e tal.

Última nota de advertência: no Windo (w) s convert também é um comando usado para formatar o disco rígido , por isso, envie algum esforço para remover as abutências se você implantar nessa.

Se você está preocupado com os arquivos maliciosos, use um verificador de antivírus, ou melhor ainda, dois deles, uma vez que um pode estar atrasado em uma nova tensão especial.

Os tipos MIME podem ser falsificados, como pode usar o file .

Você pode usar o código para abri-lo, verificando se todos os blocos são os tamanhos certos, mas as explorações aproveitam as falhas no código usado para abrir a imagem. Você poderia abrir a porta para explorar em seu host / servidor se o seu código não for endurecido e consciente de todas as formas em que poderia ser explorado – é quase uma situação de frango e ovo, então eu me inclino para confiar mais algumas ferramentas antivírus.

Eu não iria para a validação do tipo de imagem de 100%, eu uso um script simples para verificar a validação do tipo de imagem

 $imgExtension = array('jpg','jpe','jpeg','gif','png'); $image_name = pathinfo($_FILES['image']['name']); $extension = strtolower($image_name['extension']); if(in_array($extension,$ImgExtension)){ //process file upload - move_uploaded_file() } 

?>

Ainda assim, você também pode verificar o tipo mime para fazer uma validação mais precisa.

Não tenho certeza se é completamente seguro, mas você poderia usar

 if( getimagesize($filename) ) //probably an image