Rischi di un modulo di caricamento di immagini PHP

42

Il mio cliente desidera un sito di fotografia in cui gli utenti possano caricare le proprie foto in risposta a concorsi fotografici. Sebbene tecnicamente questo non sia un problema, voglio sapere i rischi associati al permettere a qualsiasi utente di caricare qualsiasi immagine sul mio server. Ho la sensazione che i rischi siano alti ...

Stavo pensando di usare qualcosa come questo link

Se permetto agli utenti anonimi di caricare file, come posso proteggere la directory in cui verranno caricate le immagini (e i file potenzialmente dannosi)?

    
posta Starkers 19.03.2013 - 12:46
fonte

2 risposte

75

La più grande preoccupazione è ovviamente che gli utenti malintenzionati caricheranno cose che non sono immagini sul tuo server. In particolare, potrebbero caricare file eseguibili o script che tenteranno di ingannare dal tuo server.

Un modo per proteggersi da questo è assicurarsi che i file non siano eseguibili dopo move_uploaded_file in PHP. Questo è semplice come utilizzando chmod() per impostare i permessi 644.

Ricorda che un utente può ancora caricare script PHP o altri script e ingannare Apache nell'esecuzione di questi a seconda della configurazione.

Per evitare ciò, chiama getimagesize() sui file dopo che sono stati caricati e determina quale file tipo sono Rinomina i file in un nome file univoco e utilizza la tua propria estensione . In questo modo, se un utente carica evil.jpg.php , lo script lo salverà come 12345.jpg e non sarà eseguibile. Meglio ancora, il tuo script non lo toccherà nemmeno perché sarà un JPEG non valido.

Personalmente, rinomini sempre le immagini caricate al timestamp corrente da time() o un UUID. Questo aiuta anche a prevenire i nomi di file molto malvagi (come qualcuno che cerca di caricare un file che hanno chiamato ../../../../../../../../etc/passwd )

Come ulteriore protezione puoi usare ciò che a volte è noto come "Image Firewall". Fondamentalmente questo consiste nel salvare le immagini caricate in una directory che è al di fuori della radice del documento e visualizzarle tramite uno script PHP che chiama readfile() per visualizzarli. Questo potrebbe essere un sacco di lavoro, ma è l'opzione più sicura.

Una preoccupazione secondaria è che gli utenti caricano troppi file o file che sono troppo grandi, consumando tutto lo spazio disponibile su disco o riempiendo la quota dell'utente ospitante. Questo può essere gestito all'interno del tuo software, compresa la limitazione della dimensione dei singoli file, la quantità di dati che un utente può caricare, la dimensione totale di tutti i caricamenti, ecc. Assicurarsi che l'utente amministratore del sito web abbia un modo per gestire ed eliminare questi file.

Non fai affidamento su uno qualsiasi dei dati in $_FILES . Molti siti ti dicono di controllare il tipo mime del file, da $_FILES[0]['type'] o controllando l'estensione del nome del file. Non farlo . Tutto sotto $_FILES con l'eccezione di tmp_name può essere manipolato da un utente malintenzionato . Se sai che vuoi che le immagini chiamino solo getimagesize mentre legge effettivamente i dati dell'immagine e saprà se il file è davvero un'immagine.

Non fai affidamento sul controllo del Referrer HTTP per qualsiasi sicurezza. Molti siti consigliano di verificare che il referrer sia il proprio sito per assicurarsi che il file sia legittimo. Questo può facilmente essere falso.

Per ulteriori informazioni, ecco alcuni buoni articoli:

risposta data 19.03.2013 - 13:26
fonte
3

Consulta alcuni link per alcuni suggerimenti importanti.

getimagesize () può essere ingannato nell'esecuzione del codice PHP.

link ha un commento utente di CertaiN che fornisce un'alternativa migliore con finfo ( FILEINFO_MIME_TYPE)

    
risposta data 10.02.2014 - 19:22
fonte

Leggi altre domande sui tag