2012-09-07 5 views
7

Ho creato (usando a script e un po 'di aiuto da Stack e aiuto da parte di amici, so molto poco di PHP) una semplice pagina per una pubblicazione locale senza scopo di lucro in cui le persone possono caricare le foto.Come posso proteggere uno script di caricamento dell'immagine PHP dagli exploit?

io non sono grande con la sicurezza (da una base di ignoranza, non intenzionale negligenza), ma ho preso le seguenti misure per proteggere questa pagina:

• script PHP è impostato per accettare solo .jpg , .png e .tif file per il caricamento;
• la sottocartella in cui salva il contenuto del modulo per disporre delle autorizzazioni impostate su 700 e la sottocartella in cui salva le foto caricate in modo che disponga delle autorizzazioni impostate su 700;
• secondo la documentazione, il mio ospite ha la seguente configurazione per garantire che solo i file .php eseguiti come .php:

<FilesMatch \.php$> 
    SetHandler php52-fcgi 
</FilesMatch> 

• Ho messo un file .htaccess nella relativa (principale e salvato il contenuto) cartelle:

RemoveHandler .php 
RemoveHandler .inc 
RemoveHandler .pl 
RemoveHandler .cgi 
RemoveHandler .py 
RemoveHandler .fcgi 

Durante la notte, però, qualcuno pensa che questa pagina di prova e sottoposti quello che sembra essere un messaggio di prova perfettamente benigna e piccole .jpg. Questa è una pagina di prova privata con un URL non intuitivo di cui solo io e altre tre persone conosciamo; nessuno degli altri ha inviato questo test.

Questo ovviamente mi ha preoccupato che ci sia qualcosa Hinky in corso, e sono preoccupato che io non so abbastanza di sicurezza per assicurarsi che la pagina è sicura.

C'è qualcosa di ovvio che mi manca?

+0

il nome file fornito dall'utente (in '$ _FILES ['upload'] ['name']') non è affidabile e può essere facilmente modificato. Non controllare queste estensioni. Controlla il tipo mime se verifica se 'getimagesize()' restituisce un risultato valido. Se possibile, genera il tuo nome file. – MarcDefiant

risposta

8

Quando si tratta di caricato si dovrebbe tenere a mente che tutti i dati si possono trovare nella gamma $ _FILES può essere falsificato. Sta viaggiando attraverso HTTP quindi è abbastanza facile dare il mime image/jpg a un file eseguibile per esempio.

1- Verificare il vero mimo

PHP sono dotati di una certa funzione per verificare la reale MIME di un file. Per questo si dovrebbe usare fileinfo

$finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic"); 
$filename = "/var/tmp/afile.jpg"; 
echo $finfo->file($filename); 

2- Controllare le proprietà della immagine

È a quanto pare vuole caricare solo l'immagine, in modo che il file ricevuto deve avere una larghezza e un'altezza:

Usa getImageSize() per ottenere tutte le informazioni necessarie sull'immagine. Se restituisce false, il file non è probabilmente un'immagine e puoi eliminarlo. getImageSize può anche darti un tipo mime, ma non so se può essere considerato attendibile.

2.5- immagine Rielabora

Come suggerito da user628405, rielaborando l'immagine con GD è probabilmente la cosa più sicura da fare.

$img = imagecreatefrompng('vulnerable.png'); 
imagepng($img, 'safe.png'); 

Ovviamente deve essere adattato in base al tipo di immagine. Vedi tutti i imagecreate da * nella documentazione php.

3- Carica cartella Inoltre di quello che hai già fatto:

Assicurarsi che la cartella di upload non è disponibile dal web. Convalidare il file caricato, quindi spostarlo in un'altra cartella, se necessario, e rinominare il file. Impedirà all'hacker di eseguire un file dannoso (impossibile eseguirlo se non può essere raggiunto da un url).

Ulteriori approfondimenti: https://www.owasp.org/index.php/Unrestricted_File_Upload

+2

Una volta ho avuto una situazione quando un ragazzo ha caricato il mio file PNG del server web con '' Inserito nei dati binari. Questo codice non è eseguibile ma è ancora accessibile tramite la funzione 'include()'. E sfortunatamente 'getimagesize()' ha restituito un valore non falso. Ho gestito questa situazione con il ri-salvataggio di tutte le immagini caricate con '$ img = imagecreatefrompng ('vulnerable.png'); imagepng ($ img, 'safe.png'); ' – CodingHamster

+0

Sono abbastanza nuovo a tutto questo, e non ho paura di fare i miei compiti, ma un paio di domande: in primo luogo, aggiungerò i comandi fileinfo e getImageSize , così come il bit di ridenominazione di file, all'interno della porzione "case '" della sceneggiatura? – JeanSibelius

+0

Tutto il controllo deve essere eseguito il prima possibile sulla variabile '$ _FILES ['my_files'] ['tmp_name']'; Se tutto va bene, puoi spostare il file, rinominarlo e fare tutto ciò che devi fare con esso. – grunk

0

Puoi controllare il tipo MIME del file, ma non preoccuparti se il tuo gestore php può solo eseguire file .php e ti stai prendendo cura di non salvare i file .php caricati nel tuo script, tu ' non esponendo alcuna perdita di sicurezza.

Questo vale per i file .php così come qualsiasi altro linguaggio di scripting lato server installato sul server del corso.

Un'idea migliore è di mantenere un bianco delle estensioni che si accettano per salvare sul proprio file system.

+1

Questo non è direttamente correlato al caricamento del campo, ma è possibile caricare un'immagine con qualche codice php malico come commento in esso. Se esiste una vulnerabilità LFI sul sito, è probabile che tu possa includere la tua immagine ed eseguire il codice dannoso. – MarcDefiant

0

vorrei ignorare il tipo MIME e l'estensione del file in entrata. Questi possono essere falsificati.

Archiviare quei file in una directory se si sta andando in quella strada.

Assicurarsi che tale directory è solo per le immagini (musica) e quindi ottenere uno script per inserire l'estensione corretta su di essi, cercando in formato file.

Assicurarsi inoltre che tale directory non può eseguire PHP (o qualsiasi altra cosa).

Questo ti manterrà al sicuro.

4

Non fare affidamento su eventuali dati dal client, tra cui il tipo di contenuto!

Non salvare i file caricati nella radice Web. I file caricati dovrebbero essere accessibili solo tramite script, per un controllo migliore.

Non salvare i file caricati con i nomi e le estensioni dei file originali! Memorizza questi dati in un database per recuperarli in seguito.

Problemi correlati