Modifica delle estensioni di file nel caricamento di file PHP per impedire l'esecuzione del codice?

1

Penso che in un caricamento di file PHP è consigliabile archiviare file al di fuori della radice del documento con un nome di file generato in modo casuale e dire al server di renderli non eseguibili, quindi il file non verrà eseguito da un tentativo per accedere al file tramite HTTP.

Se non è possibile archiviarli al di fuori della root e impedire che vengano eseguiti in un particolare ambiente, sarebbe utile modificare l'estensione dei file in uno che sicuramente non sarà trattato come uno script o qualcosa di simile?

Dopo il caricamento, l'estensione effettiva potrebbe essere salvata in un database e il file verrà salvato nel file system come sd7dsf9gd7s8sd9876asd.secureExtension anziché dangerousScript.php .

Questa sarebbe una protezione sufficiente? Quale estensione sarebbe la migliore, quindi?

    
posta kot 23.01.2017 - 16:13
fonte

2 risposte

0

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 .

    
risposta data 23.01.2017 - 16:26
fonte
1

Se il tuo webserver è configurato correttamente (cioè non eseguirà file con estensioni arbitrarie come file PHP) questo approccio funzionerà contro l'esecuzione di codice PHP *.

Controllare / modificare le estensioni è anche l'approccio corretto (accanto alla memorizzazione dei file al di fuori della web root). Il controllo dei tipi di mime è inaffidabile , complesso, e può essere aggirato da un aggressore.

Dovresti usare un'estensione inesistente o una che non ha significato nel contesto dato (cioè non .js, .html, .php, ecc.). Spesso non viene utilizzata alcuna estensione.

* Almeno visitando direttamente il file; il codice può ancora essere eseguito se il file è incluso ed eseguito da qualche altra parte

    
risposta data 23.01.2017 - 16:56
fonte

Leggi altre domande sui tag