2012-06-14 12 views
8

Duplicar posibles:
How to check file types of uploaded files in PHP?cómo comprobar el tipo de archivo subido es PDF

Tengo función para subir en mi sitio y sólo carga PDF es allowed.Than cómo comprobar que la el archivo cargado es solo pdf. Al igual que getimagesize() para activar los archivos de imagen. ¿Hay alguna forma de verificar que el archivo sea seguro? mi código se muestra a continuación.

$whitelist = array(".pdf"); 

foreach ($whitelist as $item) { 

    if (preg_match("/$item\$/i", $_FILES['uploadfile']['name'])) { 

    } 
    else { 

     redirect_to("index.php"); 
    } 
} 

$uploaddir='uploads/'; 

$uploadfile = mysql_prep($uploaddir . basename($_FILES['uploadfile']['name'])); 

if (move_uploaded_file($_FILES['uploadfile']['tmp_name'], $uploadfile)) { 

    echo "succussfully uploaded"; 
} 

en este redirect_to y se mysql_prep función definida por mí. Pero el tipo de mime se puede cambiar usando encabezados. Entonces, ¿hay alguna manera de verificar que el archivo sea original?

+1

¿Por qué tienes un vacío 'if'? Y usa la sangría adecuada para tu código o sucederán cosas malas. – PeeHaa

+0

Solo quería comprobar si es maches o no ..? – StaticVariable

+0

Simplemente hazlo: 'if (! Preg_match ("/$ item \ $/i ", $ _FILES ['uploadfile'] ['name'])) {redirect_to (" index.php "); } ' – PeeHaa

Respuesta

14

Puede verificar el tipo MIME del archivo usando PHP File Info Functions. Si vuelve con el tipo 'application/pdf', debe ser un PDF.

Las funciones de información de archivo se agregaron en PHP 5.3, pero antes de eso, puede usar la función mime_content_type.

+1

pero si tengo un archivo php y escriba (encabezado: type = "application/pdf") ... que también me mostrará el mismo – StaticVariable

+0

Eso es cierto, pero eso es menos probable y depende de cuán crítico sea esto –

+0

+1 esa es la respuesta correcta aquí. función de información de archivo proporciona una forma de obtener ** verdadero *** tipo de mime del archivo – Sarfraz

7

Busque el PDF magic number abriendo el archivo y leyendo los primeros bytes de datos. La mayoría de los archivos tienen un formato específico y los archivos PDF comienzan con %PDF.

Puede comprobar los 5 primeros caracteres del archivo, si es que son iguales a "% PDF-", es probable un PDF real (sin embargo, esto no prueba definitivamente que es un archivo PDF, como cualquier archivo puede comenzar con esos 5 caracteres). Los siguientes 4 caracteres en un archivo PDF adecuado contienen el número de versión (es decir, 1.2).

+0

¡Esa es una solución MUY cara! : D – HBv6

+1

¿No es esto básicamente lo que las comprobaciones de tipo MIME también hacen, pero de una manera más económica? – Frog

+2

Buen punto, es esencialmente lo que probablemente ya está haciendo una comprobación tipo mimo. Pero, si desea estar más seguro de que es un archivo PDF válido (y no le molesta el tiempo de procesamiento adicional), puede escanear el archivo para buscar otras construcciones esperadas, como el marcador PDF "%% EOF" en el final del archivo. (suponiendo que esto sea más de lo que hace el control de mimo) – Mike

8
mime_content_type('file.ext'); 

mime_content_type()

+4

Pero tenga en cuenta que [está en desuso] (http://php.net/manual/en/function.mime-content-type.php). – PeeHaa

+1

@PeeHaa Oh, gracias ... Necesito actualizar mi conocimiento: X – HBv6

+0

@PeeHaa ¿puedes actualizar tu respuesta? Esto no ha sido desaprobado. (Ver el enlace.) Tal vez fue traído a la vida? – daprezjer

Cuestiones relacionadas