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: