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
$uploadOk
variabile. Hai già e gestisci la$errorMessage
variabile e questo è sufficiente per verificare se il file è stato caricato correttamente. - Dovresti definire
$imageFileType
come minuscolo, invece di chiamarestrtolower()
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
WebM
eOgg
, perchéstrtolower($imageFileType) != "Ogg"
estrtolower($imageFileType) != "WebM"
sarà sempreFALSE
).