Modo sicuro per caricare immagini php e GIF

Aug 20 2020

Sto creando un social network e voglio sapere se questo è un modo sicuro per caricare foto/gif e video.

if(isset($_POST['post'])) {

    $uploadOk = 1;
    $imageName = $_FILES['postToUpload']['name'];
    $errorMessage = "";
    $picdate = date('Y-m-d_H-i-s');

    if($imageName != "") {
        $targetDir = "assets/images/posts/";
        $imageName = $targetDir . uniqid() . basename($imageName);
        $imageFileType = pathinfo($imageName, PATHINFO_EXTENSION);
        
        if($_FILES['postToUpload']['size'] > 10971520) {
            $errorMessage = "Your file is to large";
            $uploadOk = 0;
        }

        if (strtolower($imageFileType) != "jpeg" && strtolower($imageFileType) != "png" &&
            strtolower($imageFileType) != "jpg" && strtolower($imageFileType) != "gif"
            && strtolower($imageFileType) != "mp4"&& strtolower($imageFileType) != "Ogg"
            && strtolower($imageFileType) != "WebM"){

            $errorMessage = "File type not allowed.";
            $uploadOk = 0;
        }

        if($uploadOk){
            if(move_uploaded_file($_FILES['postToUpload']['tmp_name'], $imageName)) {
                // image uploaded

            } else{
                // image did not upload
                $uploadOk = 0;
            }
        }
    }

    if($uploadOk) {

    $post = new Post($con, $userLoggedIn);

    $post->submitPost(trim(strip_tags(filter_var($_POST['post_text'], FILTER_SANITIZE_STRING))), 
        'none', $imageName);

    } else {

        echo "<div class='alert alert-danger'>
                $errorMessage
            </div>";
    }
}

Risposte

2 Victor Sep 11 2020 at 20:56

Il tuo codice non è sicuro perché:

  • Si basa solo sull'estensione del file, quindi gli aggressori possono caricare qualsiasi backdoor.
  • Accede alla variabile $_FILES['postToUpload']['name']senza controllare se è definita e questo può portare alla divulgazione del percorso completo.
  • Utilizza la funzione uniqid()senza argomenti, quindi l'univocità non è garantita e i file che vengono caricati contemporaneamente e hanno lo stesso nome file verranno sovrascritti.
  • Memorizza il nome file fornito dall'utente senza rimuovere caratteri potenzialmente pericolosi e questo può portare a risultati imprevisti.

Alcuni consigli per migliorare il tuo codice:

  • Sbarazzarsi della $uploadOkvariabile. Hai già e gestisci la $errorMessagevariabile e questo è sufficiente per verificare se il file è stato caricato correttamente.
  • Dovresti definire $imageFileTypecome minuscolo, invece di chiamare strtolower()per ogni estensione.
  • Dovresti definire tutte le estensioni di file accettate come minuscole, altrimenti gli utenti non saranno in grado di caricare alcuni file (nel tuo caso WebMe Ogg, perché strtolower($imageFileType) != "Ogg"e strtolower($imageFileType) != "WebM"sarà sempre FALSE).