MB Dev .tech
Registrieren Login

Sicherheit Basics · Uploads & Sicherheit

← Zurück zu Sicherheit Basics

Datei-Uploads gehören zu den gefährlichsten Funktionen in Webanwendungen. Der Server nimmt dabei Daten entgegen, die vollständig vom Benutzer kontrolliert werden.

Achtung
Ein Upload ist kein „Datei speichern“, sondern ein Angriffsvektor

Unsichere Uploads können dazu führen, dass Angreifer Code ausführen, Dateien überschreiben oder Daten auslesen.

1) Warum Uploads gefährlich sind

Viele denken: „Ich erlaube nur Bilder, also ist alles sicher.“ Das Problem ist: Dateinamen, Dateitypen und Inhalte können manipuliert werden.

  • Dateiendungen können gefälscht werden (bild.jpg.php)
  • MIME-Typen aus dem Browser sind nicht vertrauenswürdig
  • Hochgeladene Dateien können direkt aufgerufen werden
Merke
Alles am Upload kommt vom Angreifer

Dateiname, Typ, Inhalt – nichts davon ist automatisch „echt“.

2) Dateinamen niemals ungeprüft übernehmen

Ein klassischer Fehler ist, den Dateinamen direkt zu verwenden:

Unsicher (nicht nachmachen)

$target = 'uploads/' . $_FILES['file']['name'];
move_uploaded_file($_FILES['file']['tmp_name'], $target);

Sicherer ist: eigener Dateiname, zufällig generiert.

Besser

$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
$filename = bin2hex(random_bytes(16)) . '.' . $ext;
$target = 'uploads/' . $filename;

move_uploaded_file($_FILES['file']['tmp_name'], $target);

3) Dateityp prüfen (nicht nur Endung)

Die Dateiendung allein reicht nicht aus. Besser ist es, den tatsächlichen Dateityp zu prüfen.

MIME-Type prüfen

$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime  = finfo_file($finfo, $_FILES['file']['tmp_name']);
finfo_close($finfo);

$allowed = ['image/jpeg', 'image/png'];

if (!in_array($mime, $allowed, true)) {
    echo "Ungültiger Dateityp";
    exit;
}
Achtung
Browser-MIME-Typen sind nicht zuverlässig

$_FILES['type'] kommt vom Client – prüfe immer serverseitig.

4) Upload-Verzeichnis richtig absichern

Selbst valide Dateien sollten nicht einfach im Webroot liegen. Ideal ist ein Verzeichnis, das nicht direkt per URL aufrufbar ist.

  • Uploads außerhalb des Webroots speichern
  • Oder Ausführung von Skripten explizit verbieten
  • Dateien nur über ein PHP-Skript ausliefern
Merke
Upload ≠ direkt ausliefern

Je weniger der Webserver mit Uploads „machen darf“, desto sicherer.

5) Typische Schutzmaßnahmen im Überblick

  • Dateigröße begrenzen
  • Dateityp serverseitig prüfen
  • Eigenen Dateinamen vergeben
  • Uploads nicht ausführbar speichern
  • Fehlermeldungen nicht zu detailliert ausgeben
Tipp
Uploads immer „paranoid“ behandeln

Wenn du unsicher bist, ob ein Upload nötig ist – lieber weglassen. Jeder Upload erhöht die Angriffsfläche.