Mi pensamiento sobre el tema es simple: todas las imágenes cargadas son malas.
Y no solo porque pueden contener códigos maliciosos, sino especialmente debido a las metaetiquetas. Soy consciente de que los rastreadores que navegan por la web encuentran algunas imágenes protegidas usando sus metaetiquetas ocultas y luego juegan con sus derechos de autor. Tal vez un poco paranoico, pero como las imágenes cargadas por el usuario están fuera de control sobre cuestiones de derechos de autor, lo tomo en serio en cuenta.
Para deshacerme de esos problemas, sistemáticamente convierto todas las imágenes cargadas a png usando gd. Esto tiene muchas ventajas: la imagen está limpia de eventuales códigos maliciosos y metaetiquetas, solo tengo un formato para todas las imágenes cargadas, puedo ajustar el tamaño de la imagen para que coincida con mi estándar, y ... Sé de inmediato si el la imagen es válida o no! Si la imagen no se puede abrir para la conversión (usando imagecreatefromstring, que no se preocupa del formato de imagen), considero que la imagen no es válida.
Una aplicación simple podría tener este aspecto:
function imageUploaded($source, $target)
{
// check for image size (see @DaveRandom's comment)
$size = getimagesize($source);
if ($size === false) {
throw new Exception("{$source}: Invalid image.");
}
if ($size[0] > 2000 || $size[1] > 2000) {
throw new Exception("{$source}: Too large.");
}
// loads it and convert it to png
$sourceImg = @imagecreatefromstring(@file_get_contents($source));
if ($sourceImg === false) {
throw new Exception("{$source}: Invalid image.");
}
$width = imagesx($sourceImg);
$height = imagesy($sourceImg);
$targetImg = imagecreatetruecolor($width, $height);
imagecopy($targetImg, $sourceImg, 0, 0, 0, 0, $width, $height);
imagedestroy($sourceImg);
imagepng($targetImg, $target);
imagedestroy($targetImg);
}
para probarlo:
header('Content-type: image/png');
imageUploaded('http://www.dogsdata.com/wp-content/uploads/2012/03/Companion-Yellow-dog.jpg', 'php://output');
Esto no responde exactamente a su pregunta, ya que es el mismo tipo de truco que la respuesta aceptada, pero le doy mis razones para usarlo, al menos :-)
Hasta donde yo sé, este es realmente el truco aceptado para hacer esto. Me interesaría escuchar mejores métodos si existen. –
Los documentos dicen que devuelve una matriz con 7 elementos, ¿qué elemento debo verificar para ver si es una imagen o no? –
cero y uno para ancho y alto. –