Sarà sempre possibile. Ad esempio, se c'è uno script di shell, non importa quanto difficilmente hai evitato l'esecuzione, un semplice sh something
lo eseguirà probabilmente.
Se è fuori dalla directory root del virtualhost, è sicuramente una buona idea, chiude l'attacco più comune (caricando qualcosa che non è quello che sembra, e poi ingannando il web server per eseguirlo).
Nota: su Unix, l'estensione del file non significa troppo per il sistema operativo per determinare, che cosa ha a che fare con esso, il sistema operativo decide di basarsi principalmente sul suo contenuto. Non ci sono nemmeno estensioni di file (sono semplicemente parte del nome del file, dopo il primo punto).
Se vuoi assicurarti che:
- Innanzitutto, non utilizzare "liste negative", cioè non specificare cosa "non dovrebbe essere fatto". Per impostazione predefinita, tutto dovrebbe essere vietato. Avere un elenco - breve - positivo, che cosa "potrebbe essere fatto".
- Per applicare questa concezione, ritengo la migliore idea se esamini i contenuti dei file. Ad esempio, se sai che dovrebbero essere immagini, controlla il loro contenuto e consenti solo i file png, jpeg, ... etc.
- Nel caso del caricamento di file basato su HTTP, potresti anche inserire dei vincoli sul tipo mime dei file caricati, ma non dimenticare: è impostato dal lato client, ovvero possono dire un
application/png
mime digita, mentre è essenzialmente uno script php.
Se un contenuto caricato non corrisponde al tuo breve elenco dei tipi di file consentiti, quindi fornisci all'utente un messaggio di errore almeno parzialmente fuorviante (ad esempio, "caricamento non consentito" o simile) e avvia un allarme di sicurezza .