Sicurezza dei File Upload in PHP

by theArchitect
SHARE
Sicurezza dei File Upload in PHP
© Guida-HTML5.it

Introduzione

La gestione dei file upload è una funzionalità comune nelle applicazioni web, ma può rappresentare un grave rischio per la sicurezza se non viene gestita correttamente. Gli attaccanti possono caricare file dannosi sul server, compromettendo l´intera applicazione. In questo tutorial, esploreremo come implementare una gestione sicura dei file upload in PHP, proteggendo la tua applicazione da potenziali minacce.

Codice completo

Di seguito è riportato un esempio di codice PHP che gestisce il caricamento di file in modo sicuro. Questo esempio include controlli per il tipo di file, la dimensione e la posizione in cui i file vengono salvati.

<?php
// Directory in cui salvare i file caricati
$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;

// Controllo se il file è un´immagine
$imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
        echo "Il file è un´immagine - " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "Il file non è un´immagine.";
        $uploadOk = 0;
    }
}

// Controllo del formato del file
$allowedTypes = [´jpg´, ´png´, ´jpeg´, ´gif´];
if(!in_array($imageFileType, $allowedTypes)) {
    echo "Spiacente, solo file JPG, JPEG, PNG & GIF sono consentiti.";
    $uploadOk = 0;
}

// Controllo della dimensione del file (max 2MB)
if ($_FILES["fileToUpload"]["size"] > 2000000) {
    echo "Spiacente, il tuo file è troppo grande.";
    $uploadOk = 0;
}

// Controllo se $uploadOk è impostato a 0 da un errore
if ($uploadOk == 0) {
    echo "Spiacente, il tuo file non è stato caricato.";
// Se tutto è ok, prova a caricare il file
} else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
        echo "Il file ". htmlspecialchars(basename($_FILES["fileToUpload"]["name"])) . " è stato caricato.";
    } else {
        echo "Spiacente, si è verificato un errore nel caricamento del tuo file.";
    }
}
?>

Spiegazione

Analizziamo il codice passo dopo passo:

  • Directory di destinazione: La variabile $targetDir definisce la cartella in cui i file verranno salvati. Assicurati che questa cartella abbia i permessi corretti per la scrittura.
  • Controllo del tipo di file: Utilizziamo la funzione getimagesize() per verificare se il file caricato è un´immagine. Questo è un primo passo per prevenire il caricamento di file dannosi.
  • Controllo delle estensioni: La lista $allowedTypes contiene le sole estensioni di file consentite. Utilizziamo in_array() per verificare se l´estensione del file caricato è tra quelle autorizzate.
  • Controllo della dimensione: Limitiamo la dimensione dei file caricati a 2MB per prevenire attacchi di tipo DoS (Denial of Service) tramite file molto grandi.
  • Caricamento del file: Se tutti i controlli sono superati, utilizziamo move_uploaded_file() per spostare il file dalla cartella temporanea alla directory di destinazione.

Best practice

Per garantire una gestione sicura dei file upload, considera le seguenti best practice:

  • Sanitizzazione del nome del file: Utilizza htmlspecialchars() o funzioni simili per prevenire attacchi XSS attraverso il nome del file.
  • Controllo dei permessi della directory: La directory di upload dovrebbe avere permessi restrittivi. Evita di consentire l´esecuzione di file PHP in questa cartella.
  • Utilizzo di nomi univoci: Genera nomi univoci per i file caricati (ad esempio, utilizzando uniqid()) per evitare conflitti e sovrascritture.
  • Limitazione dei tipi di file: Permetti solo i formati di file necessari per la tua applicazione e verifica sempre il contenuto del file.
  • Monitoraggio e logging: Implementa un sistema di logging per monitorare i file caricati e rilevare attività sospette.

Riepilogo

La gestione sicura dei file upload è fondamentale per proteggere le tue applicazioni PHP da attacchi malevoli. Seguendo le best practice descritte in questo tutorial, puoi ridurre significativamente i rischi associati al caricamento di file. Ricorda sempre di implementare controlli rigorosi e di monitorare costantemente la tua applicazione per eventuali vulnerabilità.

Approfondisci con risorse ufficiali

SHARE