Menú
Está libre
registrarse
el principal  /  Consejo / PHP como contenido para determinar el tipo de archivo. Archivo de expansión de archivos php

PHP como contenido para determinar el tipo de archivo. Archivo de expansión de archivos php

La última línea está cerca. Puede usar: IF (MIME_CONTENT_TYPE ($ _ archivos ["FUPLOAD"] ["TMP_NAME"]) \u003d\u003d "Imagen / GIF") (...

En el caso de que ahora trabajo, My $ _Files .. ["tipo"] se reporta a sí mismo como "Texto / CSV", mientras que MIME_CONTENT_TYPE () y FINFO () (ofrecido por otros) informan "Texto / Plain". Según @deceze, $ _files .. ["tipo"] útil solo para saber qué tipo de cliente lo considera un archivo.

UNA ADVERTENCIA : La siguiente respuesta no revisa realmente el tipo de archivo. Él revisa solo el nombre. Eso no adecuado Para los objetivos de seguridad reales.

Editar: No utilice este método, Ya que no realiza cheques de seguridad. Dejo esta respuesta aquí para que nadie cometa el mismo error, ya que trato de hacerlo.

Probé lo siguiente, y funcionó para mí:

$ permitido \u003d Array ("GIF", "PNG", "JPG", "PDF"); $ FILENAME \u003d $ _FILES ["INPUT_TAG_NAME"] ["NOMBRE"]; $ Ext \u003d pathinfo ($ nombre de archivo, pathinfo_extension); Si (! In_array ($ ext, $ permitido)) (Error de eco ";)

En PHP 5.5, utilizo esta función para recibir un tipo de archivo y verificar si hay una imagen:

Función GetFileType (devuelve Image_Type_To_Mime_Type);) // Obtenga el tipo de archivo $ file_type \u003d getFileType ("Ruta / to / images / test.png"); Echo $ file_type; // Imprime la imagen / PNG // 1. Todas las imágenes tienen el tipo MIME que comienza con "Imagen" // 2. No hay otros tipos de Mime sin imagen contienen la cadena "Imagen" en ella.

Entonces podrías hacer:

Si (STRPOS ($ FILETYPE "," Imagen ")! \u003d\u003d FALSO) (// Esta es una imagen)

Este es un escenario simple con una fila, que a menudo uso.

$ image \u003d "/var/www/core/temp/image.jpg"; $ istimage \u003d explotar ("/", mime_content_type ()) \u003d\u003d "Imagen";

Básicamente, uso MIME_CONTENT_TYPE () para obtener algo así como "imagen / jpg", y luego piratee "/" y verifique el primer elemento de la matriz para ver si dice "imagen".

¡Espero que funcione!

Por supuesto, puede comprobar si es una imagen con EXIF, pero la mejor maneraCreo que debe hacer con Finfo de la siguiente manera:

$ mascato_Types \u003d Array ("Aplicación / PDF", "Imagen / JPEG", "Imagen / PNG"); $ Fileinfo \u003d finfo_open (fileinfo_mime_type); $ Detected_Type \u003d Finfo_File ($ FileInfo, $ _Files ["Datei"] ["tmp_name"]; Si (! in_array ($ detectado_type, $ mascato_tipo)) (Muere (", cargue un PDF o una imagen");) FINFO_CLOSE ($ FILEINFO);

Además de @deceze, también puede FINFO () revisar el tipo de archivos MIME sin una imagen:

$ FINFO \u003d NUEVO FINFO (); $ FILEMIMETYYPE \u003d $ FINFO-\u003e archivo ($ ruta. $ Nombre de archivo, fileinfo_mime_type);

Función AssignFilePreviews () ($ ("(" entrada "). Cambiar (Función (). Cambiar (" Vista previa de datos-contenedor "); if (PRVCNT) (IF.Files & este. Archivos) (Var Reader \u003d New FileReReder () ; Lector.onload \u003d función (e) (var img \u003d $ (" "); img.attr (" SRC ", E.Target.Result); img.error (función () ($ (prvcnt) .html (" ");)); $ (PRVCNT) .HTML (" ") ; img.appendto (prvcnt);) lector.Readasdataurl (esto.Files);))));) $ (documento) .ready (Función () (Asignación () (AssignFileReviews ()));

También procesa el caso cuando se selecciona un archivo con un tipo no válido (por ejemplo, PDF)

8 Respuestas 8.

Nunca use $ _FILES .. ["TIPO"]. La información contenida en él no se verifica en absoluto, es un valor de usuario. Compruebe el tipo usted mismo. Exif_imagetype es usualmente buena elección:

$ Allodtypes \u003d matriz (imageype_png, imageype_jpeg, imageype_gif); $ Detectedtype \u003d exif_imageType ($ _ archivos ["fload"] ["tmp_name"]; $ ERROR \u003d! in_array ($ detectedType, $ allodtypes); $ tamaño \u003d getimagesize ($ nombre de archivo); Si ($ TAMAÑO \u003d\u003d\u003d FALSO) (arroja una nueva excepción ("($ nombre de archivo): imagen no válida");) Si ($ Tamaño\u003e 2500 || $ Tamaño\u003e 2500) (arroja una nueva excepción ("($ nombre de archivo) : Imagen demasiado grande ");) Si (! $ Img \u003d @imagecreatedefromstring (archivo_get_contents ($ nombre de archivo)) (arroja una nueva excepción (" ($ nombre de archivo): contenido de imagen no válido ");)

Revisar el GetIMagesize () evita algunos ataques de DOS, porque no necesitamos intentar ejecutar el ImageCreateReRomString () de cada archivo proporcionado por el usuario que no es un archivo o un archivo demasiado grande. Desafortunadamente, de acuerdo con los documentos PHP, no puede depender de verificar el contenido del tipo de contenido.

imageCREATEFROMING () Finalmente, tratando de abrir el archivo como una imagen: si es exitoso, tenemos una imagen.

2017-07-12 09: 05: 07z

Este es un script simple de una sola línea que a menudo uso.

$ image \u003d "/var/www/core/temp/image.jpg"; $ istimage \u003d explotar ("/", mime_content_type ()) \u003d\u003d "Imagen";

Por lo general, uso MIME_CONTENT_TYPE () para obtener algo así como "imagen / jpg", y luego explorelo con "/" y verifique el primer elemento de la matriz para ver si es "imagen".

¡Espero que funcione!

2017-10-18 22: 53: 49Z

En PHP 5.5, utilizo esta función para obtener un tipo de archivo y verificar si la imagen:

Función GetFileType (devuelve Image_Type_To_Mime_Type);) // Obtenga el tipo de archivo $ file_type \u003d getFileType ("Ruta / to / images / test.png"); Echo $ file_type; // Imprime la imagen / PNG // 1. Todas las imágenes tienen el tipo MIME que comienza con "Imagen" // 2. No hay otros tipos de Mime sin imagen contienen la cadena "Imagen" en ella.

Entonces puedes hacer:

Si (STRPOS ($ FILETYPE "," Imagen ")! \u003d\u003d FALSO) (// Esta es una imagen)

Lista completa de tipos de pantomima: http: //www.sitepoint .com / Fondos web / MIME Tipo-Lista completa /

2015-06-11 16: 47: 46z

La última línea está cerca. Puede usar: IF (MIME_CONTENT_TYPE ($ _ archivos ["FUPLOAD"] ["TMP_NAME"]) \u003d\u003d "Imagen / GIF") (... P\u003e

En el caso de que ahora trabajo, mis $ _Files .. ["tipo"] se reporta a sí mismo como "Texto / CSV", mientras que MIME_CONTENT_TYPE () y FINFO () (propuesto por otros) informan "Texto / Plain". Como se indicó @deceze, $ _files .. ["tipo"] es útil para saber solo qué tipo de cliente considera el archivo.

2018-08-09 19: 38: 14z

UNA ADVERTENCIA: La siguiente respuesta no revisa realmente el tipo de archivo. Solo revisa el nombre. Eso No adecuado Para los objetivos de seguridad reales.

EDITAR: NO UTILICE ESTE MÉTODOYa que no realiza cheques de seguridad. Dejo esta respuesta aquí para que nadie cometa el mismo error, ya que trato de hacerlo.

Probé lo siguiente, y funcionó para mí.

La tarea de determinar la expansión ocurre en el desarrollo con bastante frecuencia, aquí y, y el análisis de los archivos disponibles, y busque el archivo. Al trabajar con archivos en el servidor, también hay solución frecuente Guardar el archivo no está con el nombre de la fuente, sino el destino como el nombre del archivo del valor actual del servidor TIMESTAMP. Soluciones Esta tarea existe mucho para diferentes lenguajes de programación. Aunque algunas decisiones, en primer lugar, viniendo a la mente, a veces deben ser refinadas debido a la variedad de nombres de archivos que solo pueden ser. Para un archivo llamado "myfile.txt", puede ofrecer de manera segura para dividir la cadena en partes separadas por el punto y tomar el último. Pero qué hacer con los archivos "my.file.txt" o si la extensión no se especifica "myfile"?

En este artículo, considere tales soluciones.

Por conveniencia, el nombre del archivo se establecerá en una variable de cadena:


$ filename \u003d "myfile.txt";

// Otras opciones de nombre de archivo
$ Filename \u003d. "Archivo"; // no indicó la expansión
$ filename \u003d "my.file.txt"; // señala el nombre del archivo
$ filename \u003d "dir / myfile.txt"; // nombre de archivo indicando directorio
?>

El más simple y conveniente, en mi opinión, la solución para usar la función PathInfo (), que devolverá la matriz asociada que contiene nombre completo, expansión y directorio del archivo. Después de eso, queda por retirar el elemento necesario de la matriz.



$ File_info \u003d pathinfo ($ nombre de archivo);
devuelve $ file_info ["Extensión"];
}


?>

Para no hacer su propia función, puede simplificar el código, especificando el valor de pathinfo_extension como el segundo parámetro. En este caso, la función volverá a la matriz completa, sino solo el valor de la expansión.


echo pathinfo ($ nombre de archivo, pathinfo_extension);
?>

Ambas variantes devolverán correctamente el valor de la extensión "txt", excepto en el caso donde no se especifica la extensión. Donde no hay extensiones, se devolverá una cadena vacía.

Esta solución está disponible para PHP, comenzando con la versión 4.0.3.


Si, debido a la versión PHP o cualquier otra razón, esta solución no está disponible, puede usar solución tradicional - Desglose del nombre del archivo del archivo en la parte entre los puntos, creyendo que la última parcela será la expansión.


función get_file_extension ($ nombre de archivo) (
end, finalizar (explotar ("", $ nombre de archivo));
}

echo get_file_extension ($ nombre de archivo);
?>

Aquí, la función de explosión () rompe la cadena a una matriz de caracteres, separados por puntos, y la función FIN () devuelve el último elemento de la matriz resultante.

En este ejemplo, si no se especifica la extensión, es decir, No hay puntos en el nombre del archivo, se devolverá el nombre del archivo de origen. En caso de que la extensión esté allí, se obtendrá correctamente.

22

Tenga en cuenta que es posible que no necesite usar las extensiones de archivo para determinar el tipo de archivo. Por ejemplo, para descargar el archivo ejecutable con la extensión. PNG. El tipo también puede ser forjado fácilmente por un cliente malicioso para la transmisión como una imagen. Confiando en esta información, esto es un riesgo para la seguridad..

Para el tamaño del archivo, ya usa $ _files ["ImageFile"] ["Tamaño"]; Esto es normal, creo, pero lo sabrá solo cuando se haya cargado el archivo. Sin embargo, no forma real Compruébelo antes de descargar, tengo miedo ...

Puede encontrar el código JS para la primera verificación de extensión de avance antes de que se cargue el archivo, pero aún tiene que verificar el lado del servidor, ya que todo lo que se está realizando en el lado del cliente está en esencia insegura.

No estoy seguro de que puede hacer lo mismo en el tamaño del archivo, aunque ...

Algunos navegadores pueden admitir un campo oculto llamado max_file_size (consulte la documentación de carga del archivo); Pero no estoy seguro de que realmente sea apoyado (nunca antes visto, de hecho, así, probablemente no :-()

Como comentario, es probable que desee configurar upload_max_filesize, para que le permita cargar al menos al menos lo que desee (de forma predeterminada, generalmente se instala en 2 MB, por lo que debe estar en orden)

2

PHP es el idioma del escenario en el lado del servidor, y si las imágenes están en el lado del cliente, no puede verificar su tamaño antes de descargar a través de PHP .

2

Necesitas dos cosas:

su extensión que verifica el registro-dependiente:

Si ($ strtolower ($ ext \u003d\u003d "jpg")) (// haz tus cosas)

Compruebe si el archivo en realidad contiene la imagen. La forma más fácil de hacer es FileInfo:

$ Finfo \u003d finfo_open (fileinfo_mime_type); Echo FINFO_FILE ($ FINFO, $ nombre de archivo); $ finfo_close ($ FINFO);

Un método alternativo de comprobación es si el archivo está realmente cargado en la biblioteca de imágenes como GD. Si su archivo se puede descargar con éxito, esta es una imagen.

Manten eso en mente imágenes de JPEG Puede tener cualquiera .jpg, o extension.jpeg.

3

Eso es lo que estoy haciendo:

Si ($ _ Archivos ["UserPicture"] ["Error"] \u003d\u003d 0) (// El archivo se cargó de acuerdo, por lo que está bien, para continuar con la verificación de tipo FileType. $ Subeded_Type \u003d EXIF_IMAGETYPE ($ _ archivos ["Muestre de usuario "] [" Tmp_name "]); // lo que tenemos ahora es un número que representa nuestro tipo de archivo. Cambiar ($ subida_type) (Caso" 1 ": $ subida_type \u003d" gif "; ruptura; Caso" 2 ": $ subida_type \u003d "Jpg"; ruptura; caso "3": $ subida_type \u003d "png"; romper;))

Editar: Tiene la ventaja del trabajo "en cualquier navegador", porque no depende del nombre del archivo, o algo que llegue el usuario, excepto los "errores" los valores de los archivos de matriz que nos dicen que no hubo Realmente un error.

¿Qué es un tipo de archivo MIME? Cómo definir el tipo de archivo MIME php? Cómo instalar el módulo FILEINFO y configurar un servidor local, ensamblando Denver.

MIME - Estándar describiendo la transmisión diferentes tipos datos en email, así como una especificación para la codificación de información y los mensajes de formato de tal manera que se pueden enviar a través de Internet.

Pasar matchast

Como tal, la definición de tipo MIME de un archivo se basa en su extensión (archivo). Como entiendes, esta es una definición bastante condicional de tipo MIME. Por ejemplo, el archivo Image.jpg (incluso si es algo más), en la extensión JPG, se definirá el tipo MIME: Imagen / JPEG. Por supuesto, puede analizar el contenido del archivo y se basa en él para determinar el tipo MIME correcto, pero esta solución no está incluida en mi nota.

Lo principal es que ahora necesitas entender es la necesidad de servidor. magic.Mime. El archivo donde se describen los tipos MIME. Como tal, es parte de PHP. Sucede que en las carpetas del servidor Apache puede encontrar este archivo. En general, que está buscando, él encontrará. En teoría, averigüe dónde se puede considerar Magic.Mime el valor de la opción mime_magic.magicfile De php.ini. Por ejemplo:

Sin embargo, esta opción no devolverá nada, sin embargo, intente.

Cabe destacar, para determinar el tipo de archivo MIME, el módulo FileInfo tiene en PHP. En otras palabras, siempre puede navegar, ¿tiene la oportunidad de averiguarlo o no, por la presencia de este módulo? Por ejemplo:

Entonces, si el módulo es, es decir, la posibilidad de que funcione todo. En casos extremos, puede especificar la ruta a su archivo MAGIC.MIME.

Práctica

La mayoría. manera simple Las definiciones del archivo tipo MIME a las herramientas PHP deben usar la función PHP MIME_CONTENT_TYPE () desde el módulo FILEINFO. Por ejemplo:

Como resultado, debemos obtener una cadena: imagen / JPEG.. Por supuesto, si el archivo Image.jpg existe, el módulo FileInfo está conectado y Magic.Mime disponible.

Tenga en cuenta que el valor de la función MIME_CONTENT_TYPE () debe ser una ruta completa y un nombre de archivo, para el cual usé el diseño DirName (__ File__). "image.jpg". También debe recordarse que esta característica se considera obsoleta (ENG. obsoleto) Y en el futuro se excluirá de PHP. Una alternativa puede servir como una solución escrita usando funciones PHP desde el mismo módulo FILEINFO:

Aquí, la función FINFO_OPEN () crea un recurso FILEINFO ($ FINFO). Teniendo en cuenta la constante FILEINFO_MIME_TYPE disponible en Versión PHP No inferior a 5.3.0, podremos obtener un tipo MIME de archivo (s).

Creo que ya está claro que la función PHP FINFO_FILE () utilizando el recurso FileInfo ($ FINFO) nos devuelve para obtener información para archivo especificado ($ Nombre de archivo). En nuestro caso, este es un tipo MIME: Imagen / JPEG.

Bueno, si todo lo anterior no trajo el resultado, puedes escribir tu propio analizador. También hay muchas opciones aquí. Uno de estos es el analizador del archivo MAGIC.MIME. No importa dónde esté, lo principal que él era.

Creo que pintar eso sí, ya que no tiene sentido, y así todo es más que claro. Solo quiero llamar su atención sobre el camino especificado por mí al archivo MIME.TYPES. Como probablemente lo adivinas, estamos hablando de servidor local. Más precisamente, sobre la asamblea. Denver. Y aquí, vamos sin problemas la instalación del módulo y configuramos el servidor.

Instalación y configuración

Recordemos otra vez: estamos hablando de un servidor local, el ensamblaje de Denver. Como usted entiende, tendremos que referirnos al archivo PHP.INI. Está en mi carpeta: C: \\ WebServer \\ USR \\ Local \\ PHP5 \\. En él, necesitamos conectar dos extensiones: php_fileinfo.dll y php_mime_magic.dll. Por ejemplo, así:

Extensión \u003d php_fileinfo.dll extension \u003d php_mime_magic.dll

Llamo la atención sobre el hecho de que deben existir los datos de expansión. Los tengo en la carpeta: C: \\ WebServer \\ USR \\ LOCAL \\ PHP5 \\ ext \\.

Mime_magic.debug \u003d on mime_magic.magicfile \u003d "c: \\ webserver \\ usr \\ local \\ apache \\ conf \\ magic.mime"

Tenga en cuenta que para la opción MIME_MAGIC.MAGICFILE, debe registrar el nombre completo y el nombre. mIGIC.MIME.. Eso es en realidad todo.