Sicheres Upload-Skript
Aug 17 2020
Ich erstelle ein soziales Netzwerk, in dem Benutzer ein Profilbild hochladen können. Ich möchte nur wissen, ob dies ein sicherer Weg ist. Vielen Dank.
<?php
include 'includes/header.php';
include 'includes/form_handlers/settings_handler.php';
//$userPic = ''; $date_time = date('Y-m-d_H-i-s');
if(!empty($userLoggedIn)) { if (isset($_FILES['fileToUpload'])) {
$errors= array(); $file_name = $_FILES['fileToUpload']['name']; $file_size = $_FILES['fileToUpload']['size']; $width = 1500;
$height = 1500; $file_tmp = $_FILES['fileToUpload']['tmp_name']; $file_type = $_FILES['fileToUpload']['type']; $tmp = explode('.',$_FILES['fileToUpload']['name']); $file_ext=strtolower (end ($tmp)); $extensions = array( "jpeg", "jpg", "png", "gif");
if(in_array($file_ext,$extensions)=== false){
$errors[]="extension not allowed, please choose a JPEG or PNG file."; } if ($file_size > 8097152) {
$errors[] = 'File size must be 2 MB'; } if ($width > 1500 || $height > 1500) { echo"File is to large"; } if(!$errors) {
$userPic = md5($_FILES["fileToUpload"]["name"]) . $date_time . " " . $file_name;
$profilePic = move_uploaded_file($file_tmp,"assets/images/profile_pics/" . $userPic); $file_path = "assets/images/profile_pics/" . $userPic; $stmt = $con->prepare("UPDATE users SET profile_pic = ? WHERE username = ?"); $stmt->bind_param('ss', $file_path, $username);
$stmt->execute(); $stmt->close();
header('Location: settings.php');
exit();
}
}
} else {
echo "Invalid Username";
}
?>
Antworten
5 LiamSorsby Aug 18 2020 at 21:13
Dies ist meine persönliche Meinung, aber ich würde Folgendes sagen:
- Der Code sollte formatiert sein, ich würde mir PSR-12 persönlich ansehen, da dieser Standard nach Möglichkeit befolgt werden sollte.
- move_uploaded_file schützt nicht vor Verzeichnisüberquerung. Sie sollten basename on
$_FILES['fileToUpload']['tmp_name']und einige andere Formen der Validierung verwenden - Das Überprüfen der Dateierweiterung mit
if(in_array($file_ext,$extensions)=== false)verhindert nicht, dass ein Benutzer eine schädliche Datei hochlädt. Er könnte beispielsweise ein magisches Byte verwenden, um den Server zu täuschen, dass es sich um einen bestimmten Dateityp handelt. Sie sollten sich finfo und das erste Beispiel zum Hochladen von Dateien ansehen - Sie erstellen eine Reihe von Fehlern, die derzeit in einer if-Anweisung überprüft und dann weggeworfen werden. Wenn Sie nicht vorhaben, es zu verwenden, ist es möglicherweise besser, die Funktion vorzeitig zu verlassen, als die Ausführung fortzusetzen.
- Je nachdem, wie eindeutig der Dateiname sein soll, möchten Sie möglicherweise etwas wie verwenden
uniqid(mt_rand(), true) - move_uploaded_file ersetzt eine Datei, wenn sie bereits vorhanden ist. Möglicherweise möchten Sie überprüfen, ob diese vorhanden ist, bevor Sie eine vorhandene Datei überschreiben. Abhängig von Ihrer Namenslösung ist dies sehr unwahrscheinlich, aber unter hoher Last über einen längeren Zeitraum kann dies häufiger vorkommen als Sie denken.
- Sie verwenden
UPDATE users SET profile_pic = ? WHERE username = ?Ich würde davon ausgehen, dass dieser Wert in der Datenbank vorhanden ist, da der Benutzer angemeldet sein muss. Wenn Sie jedoch nicht sicher sind, ob das Feld vorhanden ist oder nicht (ich habe die Datenbank nicht gesehen), würde ich Persönliche Verwendung:INSERT INTO users (profile_pic, username) VALUES (?,?) ON DUPLICATE KEY UPDATE profile_pic=?, username=?Dies wird in die Tabelle eingefügt, wenn die Zeile nicht vorhanden ist, wird jedoch aktualisiert, wenn dies der Fall ist. - Sie haben eine lokale Variable namens width und height festgelegt und vergleichen sie mit demselben Wert. Ich nehme an, dies sollte die tatsächlichen Dateidimensionen überprüfen.
Ich hoffe das hilft irgendwie :)