Pregunta

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 se basa en la extensión. Sin embargo, me temo que los usuarios podrían cambiar el nombre de 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 de dicho tipo de archivo?

¿Fue útil?

Solución

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

Otros consejos

Consulte la FileInfo extensión PECL para PHP, que puede hacer el MIME búsquedas mágicas para ti.

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 descubrir esto para un tipo en particular.

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

Para PNG ( http://www.w3.org/TR/PNG- Justificación.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 P N G \ r \ n \ 032 \ n

Si solo se trata de imágenes, getimagesize () debería distinguir una imagen válida de una 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.

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

En un sistema Unix, capturar la salida del comando 'archivo' debería proporcionar información adecuada.

Para obtener una respuesta exacta sobre cómo podría hacer esto rápidamente en PHP, consulte esta pregunta: ¿Cómo encuentro el tipo mime de un archivo con php?

Como nota al margen, me encontré con un problema similar en el que tenía que hacer mi propia verificació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 verificación de tipo MIME usando php, el tipo que siempre se devolvía era application / octetstream porque provenía de flash.

Tuve que implementar un paradigma de tipo de 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 comienzo 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. Tampoco noté ninguna disminución real del rendimiento que esperaba.

Esta es solo una nota al margen para cualquier persona que pueda estar utilizando Flash como interfaz y que intente escribir el archivo una vez que se haya subido.

Además de identificar el tipo de archivo, es posible que desee vigilar los archivos con otros archivos incrustados o agregados a ellos. 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 se puede solucionar fácilmente cargar y volver a guardar en un nuevo archivo los datos de la imagen real ... otros serán más difíciles).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top