php - usar - ¿Cómo verificar si un archivo cargado es una imagen sin tipo de mime?
usar atributo alt en html (7)
¿No es posible interrogar el archivo con finfo_file ?
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimetype = finfo_file($finfo, $filename); //should contain mime-type
finfo_close($finfo);
Esta respuesta no se ha probado, pero se basa en esta discusión del foro en los foros de Uploadify.
También me gustaría señalar que finfo debería "tratar de adivinar el tipo de contenido y la codificación de un archivo buscando ciertas secuencias de bytes mágicos en posiciones específicas dentro del archivo", así que en mi opinión esto debería funcionar aunque Uploadify haya especificado el mimo equivocado. tipo.
Me gustaría comprobar si un archivo cargado es un archivo de imagen (por ejemplo, png, jpg, jpeg, gif, bmp) u otro archivo. El problema es que estoy usando Uploadify para subir los archivos, lo que cambia el tipo de mime y da un ''text / octal'' o algo así como el tipo de mime, sin importar qué tipo de archivo cargues.
¿Hay alguna manera de verificar si el archivo cargado es una imagen además de verificar la extensión del archivo usando PHP?
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 por 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 se ajuste a mi estándar, y ... inmediatamente sé si la imagen es válido o no! Si la imagen no se puede abrir para la conversión (utilizando imagecreatefromstring que no se preocupa por el formato de la imagen), considero que la imagen no es válida.
Una implementación simple podría verse así:
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 este es el mismo tipo de hack que la respuesta aceptada, pero le doy mis razones para usarlo, al menos :-)
Pruebe usar exif_imagetype para recuperar el tipo real de la imagen. Si el archivo es demasiado pequeño arrojará un error y si no puede encontrarlo, devolverá falso
Puede verificar el tipo de imagen comprobando los números mágicos al principio del archivo.
Por ejemplo: cada archivo JPEG comienza con un bloque "FF D8 FF E0" .
Aquí hay más información sobre números mágicos
Puede verificar los primeros bytes del archivo para el número mágico para descubrir el formato de la imagen.
Si Uploadify realmente cambia el tipo de mime, lo consideraría un error. No tiene ningún sentido, porque eso impide que los desarrolladores trabajen con funciones basadas en mime-tipo en PHP:
- finfo_open ()
- mime_content_type ()
- exif_imagetype ()
Esta es una pequeña función auxiliar que devuelve el tipo MIME basado en los primeros 6 bytes de un archivo.
/**
* Returns the image mime-type based on the first 6 bytes of a file
* It defaults to "application/octet-stream".
* It returns false, if problem with file or empty file.
*
* @param string $file
* @return string Mime-Type
*/
function isImage($file)
{
$fh = fopen($file,''rb'');
if ($fh) {
$bytes = fread($fh, 6); // read 6 bytes
fclose($fh); // close file
if ($bytes === false) { // bytes there?
return false;
}
// ok, bytes there, lets compare....
if (substr($bytes,0,3) == "/xff/xd8/xff") {
return ''image/jpeg'';
}
if ($bytes == "/x89PNG/x0d/x0a") {
return ''image/png'';
}
if ($bytes == "GIF87a" or $bytes == "GIF89a") {
return ''image/gif'';
}
return ''application/octet-stream'';
}
return false;
}
Puede usar getimagesize()
que devuelve ceros para el tamaño en no imágenes.