varios valores validar texto subir subida mostrar manejo leer ejemplos ejemplo archivos archivo _files php upload mime-types file-type

valores - subir archivos php ejemplo



¿Cómo puedo saber si alguien está falsificando un tipo de archivo?(PHP) (9)

En un sistema Unix, la captura de la salida del comando ''archivo'' debe proporcionar información adecuada.

Estoy programando algo que permite a los usuarios almacenar documentos e imágenes en un servidor web, para almacenarlos y recuperarlos más tarde. Cuando los usuarios cargan archivos en mi servidor, PHP me dice qué tipo de archivo está basado en la extensión. Sin embargo, me temo que los usuarios podrían renombrar un archivo zip como somezipfile.png y almacenarlo, manteniendo así un archivo zip en mi servidor. ¿Hay alguna forma razonable de abrir un archivo cargado y "verificar" para ver si realmente es del dicho tipo de archivo?


Más o menos La mayoría de los tipos de archivos tienen algunos bytes reservados para marcarlos para que no tenga que depender de la extensión. El sitio http://wotsit.org es un gran recurso para encontrar esto para un tipo particular.

Si está en un sistema Unix, creo que el comando de archivo no depende de la extensión, por lo que puede pagarlo si no desea escribir el código de comprobación de bytes.

Para PNG ( http://www.w3.org/TR/PNG-Rationale.html )

Los primeros ocho bytes de un archivo PNG siempre contienen los siguientes valores:

(decimal) 137 80 78 71 13 10 26 10

(hexadecimal) 89 50 4e 47 0d 0a 1a 0a

(Notación ASCII C) / 211 PNG / r / n / 032 / n


Número mágico Si puede leer los primeros bytes de un archivo binario, puede saber qué tipo de archivo es.


Muchos tipos de archivos tienen " números mágicos " al comienzo del archivo para identificarlos. Puede leer algunos bytes del frente del archivo y compararlos con una lista de números mágicos conocidos.


Si solo se trata de imágenes, getimagesize () debería distinguir una imagen válida de una imagen falsa.

$ php -r ''var_dump(getimagesize("b&n.jpg"));'' array(7) { [0]=> int(200) [1]=> int(200) [2]=> int(2) [3]=> string(24) "width="200" height="200"" ["bits"]=> int(8) ["channels"]=> int(3) ["mime"]=> string(10) "image/jpeg" } $ php -r ''var_dump(getimagesize("/etc/passwd"));'' bool(false)

Un valor falso de getimagesize no es una imagen.


Además de identificar el tipo de archivo, es posible que desee tener cuidado con los archivos que tengan otros archivos incrustados o anexados. Desafortunadamente, esto requerirá un análisis más profundo del contenido del archivo que simplemente usar "números mágicos".

Por ejemplo, http://quantumrook.wordpress.com/2007/06/06/hide-a-rar-file-in-a-jpg-file/ (este tipo particular de ocultación de datos puede solucionarse fácilmente cargando y volver a guardar en un archivo nuevo los datos de la imagen real ... otros serán más difíciles).


Como nota al margen, encontré un problema similar en el que tuve que hacer mi propia comprobación de tipos. La interfaz frontal de mi aplicación se realizó en flash. Los archivos se pasaban a través de flash a un script php. Cuando intentaba hacer una comprobación de tipo MIME utilizando php, el tipo siempre devuelto era application / octetstream porque venía de flash.

Tuve que implementar un paradigma tipo números mágicos. Simplemente creé un archivo xml que contenía el tipo de archivo junto con algunos patrones de definición que se encuentran al principio del archivo. Una vez que el archivo llegó al servidor hice una coincidencia de patrones con el archivo xml y luego acepté o rechacé el archivo. No noté ninguna disminución en el rendimiento real, ya sea que estaba esperando.

Esta es solo una nota al margen para cualquiera que pueda estar usando el flash como interfaz y trate de escribir en el archivo una vez que se cargue.


Consulte la extensión FileInfo PECL para PHP, que puede hacer las búsquedas de magia MIME por usted.