Quando si proteggono i caricamenti di immagini ci sono fondamentalmente tre approcci che conosco (ovviamente, idealmente, tutti e tre sono usati):
- controlla l'estensione del file
- archivia i file caricati nella directory non eseguibile al di fuori del webroot
- controlla il contenuto / il tipo mime del file
Per il terzo punto, ci sono varie funzioni PHP suggerite, molte delle quali possono essere scavalcato codificando il codice in chunk IDAT . Ecco i risultati che ottengo:
<?php $image = 'imageshell.png';
echo exif_imagetype($image);
// -> 3 (IMAGETYPE_PNG)
echo "<br>" . getimagesize($image)[2];
// -> 3 (IMAGETYPE_PNG)
echo "<br>" . mime_content_type($image);
// -> image/png
echo "<br>" . finfo_file(finfo_open(FILEINFO_MIME_TYPE), $image);
// -> image/png
echo "<br>" . finfo_file(finfo_open(FILEINFO_MIME_TYPE, "/usr/share/misc/magic"), $image);
// -> application/octet-stream
In sostanza ho queste domande ora:
- Perché il risultato è diverso se passo un file magico (non dovrebbe accettare il file come file immagine, poiché è quello che effettivamente è?), che cos'è esattamente un file magico e che cosa fa PHP integrato sembra un file magico?
- Posso controllare in anticipo se il sistema ha un file magico che consentirà di identificare correttamente una non immagine o un'immagine che contiene codice PHP?
- Se non riesco, c'è un approccio migliore per verificare se un file immagine contiene codice PHP?
- È forse possibile ignorare l'ultimo controllo - quello risultante in
application/octet-stream
- come pure?