2011-11-06 13 views
9

Controllare il tipo di mimo in php è piuttosto semplice, ma per quanto ne so può essere falsificato. L'utente malintenzionato può caricare uno script php con, ad esempio, il tipo mime jpeg. Una cosa che viene in mente è controllare l'estensione del file caricato e assicurarsi che corrisponda al tipo mime. Tutto ciò presuppone che la directory di caricamento sia accessibile dal browser.MIME Tipo spoofing

Domanda: Esistono altre tecniche per impedire ai "file danneggiati" di entrare con lo spoofing di tipo mime?

+2

La tua domanda riguardo lo spoofing di tipo mime o vuoi solo sapere come convalidare i file caricati per verificare se sono file di immagine? – CodeCaster

+0

In effetti, non dovresti fare affidamento sui tipi MIME e sull'estensione del file (e il tuo controllo, se mime-> extension, è anch'esso sbagliato, se faccio finta mime posso falsificare ancora più facilmente un file xtension corrispondente) –

+0

@CodeCaster: come assicurarsi che i file che i tipi MIME dei file caricati non siano falsificati? – abruski

risposta

8

Risposta breve: No.

Longer risposta:

Confrontando l'estensione e fare in modo che corrisponda al tipo MIME in realtà non impedisce nulla. Come è stato detto nei commenti, è ancora più semplice modificare un'estensione di file. Tipo e estensione MIME devono essere intesi solo come suggerimenti, non c'è alcuna sicurezza intrinseca in essi.

Garantire che i file in entrata non facciano danni dipende molto da quale sarà il tuo scopo per loro. Nel tuo caso ho capito che ti aspetti delle immagini. Quindi, ciò che si potrebbe fare è eseguire prima alcuni controlli di integrità: analizza i primi due byte per vedere se i file contengono le firme di intestazione dell'immagine pertinenti - tutti i formati di immagine rilevanti hanno questi.

Le "intestazioni di firma" consentono di decidere il tipo di formato di immagine che un file tenta di impersonare. In una fase successiva è possibile verificare se il resto dei contenuti è conforme al formato dell'immagine sottostante. Questo ti garantirebbe che il file è veramente un file immagine di quel formato specifico.

Ma anche in questo caso, il file potrebbe essere elaborato con cura in modo tale che quando si visualizza l'immagine, una libreria popolare utilizzata per visualizzare quell'immagine (ad es. Libpng ecc.) Verrebbe eseguita in un buffer overflow che l'utente malintenzionato ha trovato in quel biblioteca.

Sfortunatamente non c'è modo di impedirlo attivamente, oltre a non consentire alcun input dal lato client.

+0

Le immagini erano solo esempi. Sarebbe trattare con i file PDF. Ma volevo generalizzare la domanda in modo che potesse essere d'aiuto anche con altri tipi di file – abruski

+1

Il principio è sempre lo stesso. Un attaccante intelligente ti dà quello che ti aspetti, ma crea il file in modo tale da sfruttare le librerie più popolari utilizzate per visualizzare i file. Per PDF ciò significherebbe che potrebbero incorporare Javascript, video, ancora immagini ... il numero di opzioni aumenta drasticamente con le funzionalità fornite dal formato dei dati. Se tu (oi tuoi clienti!) Non "esegui mai" (la visualizzazione è "eseguendo" anche i contenuti caricati, solo allora sei al sicuro. – emboss

+0

È possibile ottenere un'immagine "sicura" copiandola in una nuova immagine utilizzando una libreria come GD o uno strumento come ImageMagick. AFAIK, non esiste alcun exploit open noto per nessuna di queste librerie: ce n'era una in GDI di Windows, ma è stata risolta da tempo. Mentre è vero che in teoria, non c'è sicurezza, ci * sono * modi per trattare i file in modo sicuro. –

-4

Controllare l'estensione.

<?php 

$okFiles = array('jpg', 'png', 'gif'); 

$pathInfo = pathinfo($filename); 

if(in_array($pathInfo['extension'], $okFiles)) { 
    //Upload 
} 
else { 
    //Error 
} 

?> 

È anche possibile - come hai detto tu - verificare se l'estensione corrisponde al tipo MIME, ma è molto più facile da controllare solo l'estensione.

A proposito, perché ti interessa il tipo MIME?

+0

per assicurarsi che il file caricato sia quello che sembra essere. Immagina: carica l'immagine MIME ma con dentro il codice php e php ext; la directory di upload è accessibile dal browser e, come immagino, l'autore dell'attacco possa eseguire liberamente un codice malevolo. – abruski

+1

@abruski Quindi non è necessario controllare il tipo MIME. Basta controllare l'estensione. Se è jpg/png/gif va bene, altrimenti lancia un errore "Solo jpg/png/gif". Non so se questo è ciò di cui hai paura, ma se l'estensione è .jpg e il MIME sais PHP verrà comunque trattato come un'immagine quando navighi nel file. – Sawny

+0

Considerato anche questo. Sto solo cercando di essere sicuro di essere sulla strada giusta. – abruski

4

In caso di immagini

  • Controllare l'estensione con una lista di quelli consentiti (es. ".jpg", ".jpeg", ".png")
  • Controllare il file caricato in sé da eseguendo getimagesize sul file, verrà restituito FALSE se non è un'immagine.

Altri tipi di caricati

  • Controllare le estensioni consentite (es. ".pdf")
  • Verificare che il tipo MIME del file corrisponde all'estensione

Campione codice:

function getRealMimeType($filename) { 
    $finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic"); 
    if (!$finfo) { 
     echo "Opening fileinfo database failed"; 
     return ""; 
    } 
    return $finfo->file($filename); 
} 

Vedere finfo_file documentazione.

+0

Non è necessario che sia un'immagine, può essere qualsiasi tipo di file. – abruski

+0

Vedo, lasciatemi espandere la risposta allora. – stivlo

+0

è ottimo se getimagesize restituisce false se non è un'immagine :-) molto utile per verificare l'id indovinare, ma cosa succede se l'estensione è falsificata e anche il tipo mime? –