Verwechselt werden hier zwei Begriffe: die Dateiendung und den Dateityp. Beide scheinen dasselbe zu sagen, meinen aber verschiedene Dinge.
Die Dateiendung ist der Teil nach dem letzten Punkt im Dateinamen, etwa „.png“ in „foto.png“. Sie stammt vom Nutzer und ist damit eine Nutzereingabe wie jedes Formularfeld. Der Name kann Pfadbestandteile wie „../“ enthalten, mit denen jemand versucht, außerhalb des vorgesehenen Ordners zu landen. Deshalb vergibt der Server selbst einen zufälligen Namen und speichert den Originalnamen nur als Datenfeld in der Datenbank.
Die Magic Bytes sind Kennbytes am Dateianfang, die den tatsächlichen Inhaltstyp anzeigen. Eine PNG-Datei beginnt immer mit derselben Bytefolge, egal wie sie heißt. Der Server liest diese Bytes beim Empfang und vergleicht sie mit der erlaubten Liste. Ein Skript, das sich „bild.png“ nennt, verrät sich hier sofort.
Die Endung sagt, was die Datei sein will; die Magic Bytes zeigen, was sie ist. Die Endung ist also eine Behauptung, die Bytes eine Messung.
Faustregel: Vor dem Speichern immer die Größe gegen ein festes Limit, den Typ anhand der Magic Bytes gegen eine erlaubte Liste und den Zielort gegen einen festgelegten Ablagepfad prüfen. Hochgeladene Dateien liegen außerhalb des öffentlichen Verzeichnisses und werden über einen Endpunkt ausgeliefert, der nur Lesen erlaubt. Denn wer eine .php-Datei ins öffentliche Auslieferungsverzeichnis speichert, kann der Angreifer den Server übernehmen, sobald der Webserver sie ausführt.
Uploads heißen nicht „gespeichert, was ankommt“, sondern „gespeichert, was drei Prüfungen bestanden hat“.
📌 Größenlimit · Magic Bytes · Ablagepfad
📚 Webentwicklung von Grund auf · Tag 22 von 30
#WebSecurity #backend #NodeJS