Domanda

Sto lavorando a uno script che elaborerà i caricamenti degli utenti sul server e come livello di sicurezza aggiuntivo vorrei sapere:

Esiste un modo per rilevare la vera estensione / tipo di file di un file e assicurarsi che non sia un altro tipo di file mascherato con un'estensione diversa?

Esiste un timbro byte o un identificatore univoco per ciascun tipo / estensione?

Mi piacerebbe essere in grado di rilevare che qualcuno non ha applicato un'estensione diversa al file che sta caricando.

Grazie

È stato utile?

Soluzione

Non proprio, no.

Dovrai leggere i primi byte di ciascun file e interpretarlo come un'intestazione per un set finito di tipi di file noti. La maggior parte dei file ha intestazioni di file distinte, una sorta di metadati nei primi byte o primi kilobyte nel caso di MP3.

Il tuo programma dovrà semplicemente provare ad analizzare il file per ciascuno dei tuoi tipi di file accettati.

Per il mio programma, invio l'immagine caricata su imagemagick in un blocco try-catch, e se esplode, allora immagino che fosse una brutta immagine. Questo dovrebbe essere considerato insicuro, perché sto caricando dati binari arbitrari (forniti dall'utente) in un programma esterno, che è generalmente un vettore di attacco. qui, mi fido di imageMagick di non fare nulla al mio sistema.

Ti consiglio di scrivere i tuoi gestori per i tipi di file significativi che intendi utilizzare, per evitare eventuali vettori di attacco.

Modifica: vedo in PHP che ci sono alcuni strumenti per farlo per te.

Inoltre, i tipi MIME sono ciò che il browser dell'utente afferma essere il file. È utile e utile leggere quelli e agire su di essi nel tuo codice, ma non è un metodo sicuro, perché chiunque ti invii file danneggiati falsificherà facilmente le intestazioni MIME. È una specie di difesa in prima linea per mantenere il tuo codice che si aspetta che un JPEG si annulli su un PNG, ma se qualcuno ha incorporato un virus in un file .exe e lo ha chiamato JPEG, non c'è motivo per non aver falsificato il tipo MIME.

Altri suggerimenti

PHP ha un paio di modi per leggere il contenuto del file per determinare il suo tipo MIME, a seconda della versione di PHP che stai usando:

Dai un'occhiata alle Funzioni di Fileinfo se usi PHP 5.3 +

$finfo = finfo_open(FILEINFO_MIME); 
$type = finfo_file($finfo, $filepath);
finfo_close($finfo);  

In alternativa, controlla mime_content_type per le versioni precedenti.

$type = mime_content_type($filepath);

Nota che solo la convalida del tipo di file non è sufficiente se vuoi essere veramente sicuro. Qualcuno potrebbe, ad esempio, caricare un file JPEG valido che sfrutta una vulnerabilità in un renderer comune. Per evitare ciò, è necessario uno scanner antivirus ben mantenuto.

PHP ha un superglobal $ _ FILES che contiene informazioni come dimensione e tipo di file. Sembra che il tipo sia preso da una specie di intestazione, non da un'estensione, ma potrei sbagliarmi.

Ne è un esempio sul sito w3schools .

Ho intenzione di provare se può essere ingannato quando ne avrò la possibilità.

AGGIORNAMENTO:

Probabilmente tutti gli altri lo sapevano, ma $ _FILES può essere ingannato. Sono stato in grado di determinarlo in questo modo:

$arg = escapeshellarg( $_FILES["file"]["tmp_name"] );
system( "file $arg", $type );
echo "Real type:  " . $type;

In pratica utilizza il comando file di Unix. Probabilmente ci sono modi migliori, ma non uso PHP da un po '. Di solito evito di usare i comandi di sistema, se possibile.

che potrebbe essere ancora forgiato. Vorrei assicurarti che non puoi (o non) eseguire un file caricato automaticamente sul server.

Vorrei anche avere un scanner per virus / spie , e lasciare che funzioni per te.

puoi utilizzare il codice seguente che ti fornisce il tipo MIME se hai modificato l'estensione, quindi anche

$finfo = finfo_open(FILEINFO_MIME_TYPE);
echo $mime = finfo_file($finfo, $_FILES['userfile']['tmp_name']);
finfo_close($finfo);

Utenti Windows: basta modificare php.ini e rimuovere il commento da questa riga:

extension=php_fileinfo.dll

Ricorda di riavviare Apache per rendere effettivo il nuovo php.ini.

In * nix, i primi due byte del file indicano (vedi " numero magico "). In Windows, ... a volte questo sarà vero (& Quot; informazioni intestazione & Quot;). Alla fine è O.S. dipendente.

Gli eseguibili in generale hanno un " firma " sui primi byte; Trovo difficile accertare davvero quale sia il tipo di file.

Quali tipi di file ti aspetti? Forse potresti verificare che sia conforme a quello che ti aspetti e rifiutare tutto il resto.

Altri hanno già menzionato FileInfo, che ritengo sia la soluzione corretta, ma lo aggiungerò nel caso in cui non fosse possibile utilizzarlo per qualche motivo. La maggior parte delle distribuzioni (tutte?) * Nix include un comando chiamato file che, quando eseguito su un file, genererà il suo tipo. Ha un interruttore per l'output in formato leggibile (predefinito) o tipo MIME. Puoi fare in modo che il tuo script invochi questo programma sul file caricato e legga il risultato. Ancora una volta, questo non è l'approccio preferito. Se sei su Windows, questa utility è disponibile tramite Cygwin.

Il controllo del tipo MIME è abbastanza semplice? Suppongo che cambiare l'estensione su un file non cambi il suo tipo MIME?

Il tipo MIME è un indicatore abbastanza forte per passare qui?

Grazie per tutte le risposte finora.

  

Il controllo del tipo MIME è abbastanza semplice? Suppongo che cambiando l'estensione su un file non cambi il suo tipo MIME? Il tipo MIME è un indicatore abbastanza forte per passare qui?

Dipende molto da come viene utilizzato.

  • Se fornisci upload e download, non importa nulla poiché non viene eseguito.
  • Se è gestito dal server Web, dipenderà da come è configurato il server Web, sebbene soggetto alla maggior parte di questi commenti.
  • Se si tratta di un'immagine, verrà visualizzata o meno oppure sarà la destinazione degli exploit della libreria di immagini. Ma solo quelli.
  • Qualcosa come un file pdf potrebbe non influire sul tuo server, ma piuttosto sul computer della persona che accede al file.
  • Se passerà a una funzione come " system () " allora torniamo al comportamento del sistema operativo - come se fosse " facendo doppio clic su " e l'estensione del file potrebbe persino essere considerata.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top