Questo è sicuro.
Si può sempre introdurre codice eseguibile all'interno di un'immagine:
- Carica il tuo codice PHP con un'altra estensione.
- Inseriscilo nei metadati, ad esempio EXIF.
- Usa pixel colorati in modo specifico in modo che la loro rappresentazione binaria sia il codice PHP desiderato, che sopravviverà alla ricodifica (l'ho visto in realtà nella realtà, sfruttato usando: link ).
Quindi dovresti già presumere che i contenuti del tuo file non siano sicuri quando sono forniti dall'utente. Anche se ricodifichi l'immagine, e anche se converti i formati, è ancora un'immagine quindi non eseguirla maleducata . Se il tuo server web (come Apache o Nginx) lo esegue tramite l'interprete PHP, allora qualcuno troverà un modo per far sì che PHP faccia qualcosa di brutto. Forzando l'estensione come una delle poche estensioni della whitelist, puoi dire al tuo server web che si tratta di un'immagine (non eseguibile) e che non dovrebbe passare attraverso l'interprete.
Ci sono, ovviamente, alcuni rischi correlati a cui prestare attenzione:
- Il tuo utente potrebbe inserire byte nulli o altre cose divertenti nel nome del file, il che potrebbe consentire loro di scegliere la propria estensione dopotutto.
- Il tuo utente potrebbe provare a utilizzare il path traversal se gli permetti di scegliere il nome del file, il che potrebbe consentire loro di fare ogni sorta di cose.
- Potresti commettere un errore nella configurazione del server web e tutto viene eseguito attraverso l'interprete indipendentemente dall'estensione (l'ho già visto prima: è un bug silenzioso, perché PHP emette letteralmente tutto ciò che non riconosce, quindi le immagini sembrerà lo stesso prima e dopo l'interpretazione di PHP).
- Il file potrebbe contenere un exploit per un decodificatore specifico, ad esempio se sai che l'amministratore potrebbe visualizzare la tua immagine e che utilizza un browser che ha un visualizzatore PNG vulnerabile, potresti caricare un'immagine PNG che sfrutta tale vulnerabilità.
I primi due sono facilmente risolvibili: non lasciare mai che l'utente scelga il proprio nome file o almeno un elenco di caratteri che sono sicuramente sicuri, come ^[a-zA-Z0-9_-]*$
(alfanumerico, trattino basso e trattino).
Il terzo può essere controllato inserendo un file chiamato "test.png" e inserendo <?php echo "test1";
in esso. Quando si richiede il file tramite curl, si dovrebbe vedere il codice completo. Se vedi solo "test1", allora è vulnerabile.
Infine, l'ultimo è difficile da controllare e alquanto fuori portata. È possibile utilizzare uno scanner di virus sul lato server, ma gli scanner antivirus catturano solo alcuni casi comuni e di solito non sono in grado di rilevare tutte le varianti di una vulnerabilità, se sono a conoscenza della vulnerabilità in primo luogo. L'utente dovrebbe, idealmente, aggiornare il proprio sistema e non eseguire software vulnerabili. Ma se ti trovi in un ambiente ad alta sicurezza, dovresti applicare la difesa in profondità e fare cose come ricodificare l'immagine, forse solo permettere agli utenti di visualizzare le immagini in una macchina virtuale, ecc. Ma questo è fuori portata per questa domanda .
Riepilogo: ci sono alcuni attacchi correlati che non hai dimostrato di essere mitigati, ma considerando solo lo snippet di codice pubblicato: quella parte è sicura.