2012-06-14 15 views
8

Eventuali duplicati:
How to check file types of uploaded files in PHP?come controllare il tipo di file caricato è PDF

ho funzione upload nel mio sito e solo caricare PDF è allowed.Than come verificare che la il file caricato è solo pdf. Proprio come getimagesize() per controllare i file di immagine. C'è un modo per verificare che il file sia sicuro di essere pdf. il mio codice è mostrato sotto.

$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"; 
} 

in questo redirect_to e mysql_prep sono funzione definita da me. Ma il tipo mime può essere cambiato usando le intestazioni. C'è un modo per controllare che il file sia il pdf originale?

+1

Perché si ha un vuoto 'if'? E per favore usa il rientro corretto per il tuo codice o accadrà cose brutte. – PeeHaa

+0

Volevo solo controllare se è maches o no ..? – StaticVariable

+0

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

risposta

14

È possibile controllare il tipo MIME del file utilizzando PHP File Info Functions. Se ritorna con il tipo 'application/pdf' allora dovrebbe essere un PDF.

Le funzioni di informazioni sui file sono state aggiunte in PHP 5.3, ma in precedenza è possibile utilizzare la funzione mime_content_type.

+1

ma se ho un file php e scrivo (header: type = "application/pdf") ... che mi mostrerà lo stesso – StaticVariable

+0

È vero, ma è meno probabile e dipende da quanto è importante questo è –

+0

+1 che è solo la risposta corretta qui. la funzione di informazione sui file fornisce un modo per ottenere ** vero *** tipo mime del file – Sarfraz

7

Cercare il PDF magic number aprendo il file e leggendo i primi pochi byte di dati. La maggior parte dei file ha un formato specifico e i file PDF iniziano con %PDF.

È possibile controllare i primi 5 caratteri del file, se sono uguali "% PDF-", è probabile che un vero e PDF (tuttavia, questo non definitivamente dimostrare che si tratta di un file PDF, come un qualsiasi file può iniziare con quei 5 caratteri). I successivi 4 caratteri in un file PDF corretto contengono il numero di versione (ad esempio 1.2).

+0

Questa è una soluzione MOLTO costosa! : D – HBv6

+1

Non è sostanzialmente ciò che fanno anche i controlli di tipo MIME, ma in un modo più economico? – Frog

+2

Buon punto, è essenzialmente quello che probabilmente un mime type check sta già facendo. Ma se vuoi essere più sicuro che sia un file PDF valido (e non ti interessa il tempo di elaborazione extra), puoi scansionare il file per altri costrutti previsti, come il marcatore PDF "%% EOF" su la fine del file. (supponendo che questo sia più di quello che fa il controllo del mimo) – Mike

8
mime_content_type('file.ext'); 

mime_content_type()

+4

Ma si noti che [è deprecato] (http://php.net/manual/en/function.mime-content-type.php). – PeeHaa

+1

@PeeHaa Oh, grazie ... Devo aggiornare le mie conoscenze: X – HBv6

+0

@PeeHaa puoi aggiornare la tua risposta? Questo non è stato deprecato. (Vedi il link.) Forse è stato riportato in vita? – daprezjer

Problemi correlati