2010-07-09 12 views
5

Estoy construyendo un sitio web donde el usuario puede cargar archivos mp3. Y, quiero verificar si el archivo es un archivo mp3. Lo que necesito saber es si hay una función de PHP que haga eso por mí.PHP Real file type

me trataron $_FILES['uploadedfile']['type']

Pero, no funciona como yo quiero, porque devuelve el tipo de archivo basado en la extensión (he comprobado sólo en Windows)

Por lo tanto, las preguntas son:

  1. ¿Hay una forma segura de hacerlo con las funciones nativas de php?
  2. El tipo de archivo basado en la extensión, ¿es un problema de php o está relacionado con el sistema operativo?
  3. ¿Qué me recomiendas?

Gracias.

+0

[cómo comprobar si el archivo es una imagen o tipo de video en php versión 5.2.9?] (Http://stackoverflow.com/questions/3074527/how-to-check-whether-file-is-image-or -video-type-in-php-version-5-2-9) cubre los mismos motivos – Gordon

Respuesta

7

1- ¿Hay una manera segura de hacerlo con las funciones nativas de php?

Para MP3, no con funciones nativas de PHP, no.

Hay fileinfo que hace uso de la funcionalidad "MIME sniffing" del sistema operativo. Si está instalado, generalmente es bastante confiable.

Como alternativa, la biblioteca getID3 afirma que puede extraer información de archivos MP3. Si puede obtener un tiempo de reproducción del archivo, es probable que sea un archivo MP3 válido.

2- El tipo de archivo basado en la extensión, ¿es un problema de php o está relacionado con el sistema operativo?

Ninguno. El navegador determina el tipo de archivo (según la extensión por lo general) y envía un tipo MIME. Al igual que con cualquier información entrante, es muy fácil de falsificar y nunca se puede confiar.

+1

+1 para getID3. Lo he usado antes para verificar si una película de QuickTime contiene pistas de transmisión. Muy, muy útil. –

1

Quiere ver los tipos MIME. La extensión de PHP fileinfo es la forma preferida de hacerlo.

1

Abra el archivo después de su carga y verifique los primeros bytes para ver si coincide con lo que debería haber en un encabezado de archivo mp3.

+0

primeros bytes también pueden ser ID3 –

+0

No dije cuáles podrían ser los primeros bytes, por lo que no estoy seguro de cómo esto se aplica a mi respuesta. ¿Estás seguro de que no quisiste decir esto como una respuesta a una de las otras respuestas? – GrandmasterB

3

La cuestión de qué es un MP3 es un poco lanosa. Los archivos MP3 suelen contener un montón de desperdicios al principio y/o al final que no son marcos MP3 válidos. Por lo general, esto es para almacenar etiquetas ID3, pero no es raro encontrar archivos MP3 con datos sin sentido en los extremos por otras razones (por ejemplo, corte de secuencias ingenuo).

En la práctica, casi cualquier cosa puede ser un MP3, y muchos archivos binarios arbitrarios tendrán algo que parece un cuadro de MP3.Buscar ID3 y la información de longitud (como en la respuesta de Pekka) es un buen enfoque heurístico para tener una idea si un archivo es probablemente para ser MP3, pero eso no es suficiente si lo que tiene en mente está relacionado con la seguridad.

devuelve el tipo de archivo basado en la extensión (he comprobado sólo en Windows)

En realidad se devuelve la cadena de tipo de navegador web del usuario envió, que en Windows será determinado por el la extensión de archivo original, pero en Mac o Linux puede provenir de otras fuentes. De cualquier manera, al igual que el nombre de archivo, no es confiable. La computadora del usuario puede estar configurada incorrectamente o puede estar enviando deliberadamente la cadena de tipo de medio incorrecta para un archivo.

¿Hay una forma segura de hacerlo con las funciones nativas de php?

¿Cuál es su intención con 'seguro'? Si su objetivo es evitar que las personas carguen archivos MP3 que en realidad son otros tipos de archivos disfrazados, generalmente con el objetivo de inyectar contenido HTML, Java o Flash para ataques de scripts entre sitios, entonces no hay una forma realista de hacerlo. Puede crear archivos que son MP3 válidos y, sin embargo, también se pueden interpretar como otro tipo al mismo tiempo. (Ver ataques 'GIFAR', lo mismo es posible con MP3.)

Al final, el único enfoque que lo protege confiablemente de los ataques XSS es servir a los archivos cargados por el usuario no confiables desde un nombre de host diferente que no comparte contexto de seguridad con el sitio principal, por lo que la creación de scripts en sitios cruzados no gana nada. Una solución parcial que también puede considerar en su lugar o también es servir todos sus archivos con un encabezado Content-Disposition: attachment (si no necesita alojar imágenes que se mostrarán en línea en una página).

+0

Sí, no sé. Siempre veo cómo youtube te permite subir algo pero, si no es un video, te dice "lo siento". Creo que tengo casi toda la información que quiero. Gracias. – mRt

Cuestiones relacionadas