Caricamento file PHP: ordine delle misure di sicurezza

1

In un modulo di caricamento di file PHP, il nome e l'estensione del file devono essere modificati per evitare attacchi di directory trasversali. Non capisco completamente questi attacchi, quindi non sono sicuro che alcuni dei miei altri controlli di sicurezza potrebbero essere a loro a rischio.

Voglio controllare la dimensione del file e il tipo mime:

$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $file['tmp_name']);
$filesize = filesize($file['tmp_name']);
// check content of variables here

Dopo voglio spostare il file dalla directory tmp in cui dovrebbero essere salvati in modo permanente con un nome file sicuro.

Il codice sopra è sicuro o devo prima spostare il file e poi fare altri controlli di sicurezza per evitare di usare sempre $file['tmp_name'] (eccetto per spostare il file)?

    
posta kot 22.04.2017 - 00:37
fonte

3 risposte

1

Sì, devi prima convalidare il file, quindi spostarlo.

Se lo sposti per primo, convalidalo e poi cancellalo se non è valido, un utente malintenzionato potrebbe avere una piccola finestra in cui un attacco potrebbe essere possibile.

Oltre a questo, tmp_name è sicuro da usare in quanto è non controllato dall'utente , quindi non c'è ragione per non usarlo Nota anche che il controllo di tipo finfo mime può essere ignorato in alcune situazioni. Questo è anche uno dei motivi per cambiare il nome del file. L'attraversamento della directory non è generalmente possibile con "name" da $ _FILES, ma la ridenominazione del file, inclusa l'estensione, può impedire l'esecuzione del file come file PHP (difese aggiuntive sarebbero ad esempio per memorizzare il file al di fuori della web root in modo che non è possibile accedere direttamente).

    
risposta data 22.04.2017 - 11:16
fonte
1

il nome e l'estensione del file devono essere modificati per evitare attacchi local file inclusion (e alcuni altri oscuri, attacchi shell locali) non gli attacchi directory traversali, che sono basati sul percorso.

I want to check file size and mime type:

L'uso di finfo è il modo di verificare il tipo di mimo. Ma perché controllare le dimensioni? Se vuoi mettere un limite superiore alla dimensione dei caricamenti, fallo nella configurazione del server web (ma configura i tuoi limiti POST), in PHP (upload_max_filesize) e ti consiglio anche check sul client .

Ogni volta che convalidi l'input, dovresti farlo il prima possibile nel ciclo di elaborazione. Quindi, prima di spostarlo dalla posizione temp.

    
risposta data 22.04.2017 - 19:35
fonte
-1

Il problema che stai incontrando proprio qui è un problema molto comune. So che non è possibile trovare molte informazioni sulla sicurezza del caricamento dei file, ed è così che il mio server a un certo punto è stato violato.

Dopo il tempo e la ricerca, ho alcuni suggerimenti per il caricamento sicuro dei file degli utenti sul tuo server:

Estensioni caricamento file
Controllare l'estensione del caricamento del file può essere molto utile per rallentare gli hacker o per fermare gli hacker che non sanno molto sull'hacking. Tuttavia, questo di gran lunga non è sufficiente per mantenere tutto al sicuro in quanto può essere bypassato.

Forza estensione file
Se le persone caricano solo file di testo o immagini, hai la possibilità di non utilizzare l'estensione del file caricato. Invece, puoi avere il codice inserito nell'estensione del file; questo può eventualmente impedire l'esecuzione di qualsiasi codice nel file caricato. Supponiamo ad esempio di consentire il caricamento delle immagini, quindi di inserire il codice nell'estensione ".png" o ".jpg" alla fine del nome del file quando lo si carica sul server.

Autorizzazione di sola lettura Questo è di gran lunga il consiglio più importante sulla mia lista! Quando i file vengono caricati, imposta le loro autorizzazioni in sola lettura insieme alla cartella in cui è memorizzata. Non si desidera mai consentire l'autorizzazione di esecuzione perché il server può eseguire il codice caricato da un utente malintenzionato.

    
risposta data 22.04.2017 - 23:09
fonte

Leggi altre domande sui tag