Nichts ist wie es scheint

Tags:

Nichts ist wie es scheint ...

Besonders als Webdeveloper kommt man mit vielen verschiedenen Dateitypen in Berührung. Den Typ einer Datei zu bestimmen ist aber gar nicht so einfach wie es den Anschein macht. Den eine Dateendung sagt rein gar nichts über eine Datei aus und kann so sogar zu gefährlichen Sicherheitslücken führen.

Aber auch John Doe sollte sich ein wenig auskennen, wenn es um Dateien im Internet geht. Denn auch für ihn gilt: Nichts ist wie es scheint!

Dateien unter Windows

Lasst uns erst mal erörtern, wie Microsoft Windows mit Dateien umgeht. Unter Windows hat (fast) jede Datei eine Endung. Von Bildern (.jpg, .gif, etc.) über Videos (.avi, .mpg, ...) zu ausführbaren Dateien (.exe, .bat, usw.). Doch wieso werden jetzt meine MP3s mit meinem Lieblingsplayer geöffnet?

Die Antwort ist ganz einfach: Windows führt eine Liste mit Assoziationen zwischen Dateiendungen und Programmen. Sobald eine Datei geöffnet werden soll wird in dieser Liste nachgeschaut, welches Programm dafür zuständig ist, und dieses anschliessend - mit dem Pfad zur Datei als Parameter - aufgerufen. Wurde für die Dateiendung kein Eintrag gefunden, öffnet sich ein Dialog, wo der Benutzer auswählen kann, mit welchem Programm er die Datei öffnen möchte.

Öffnen mit-Dialog

Wenn wir also mal ein bisschen zu viel Freizeit hätten, könnten wir all unsere MP3s mit der Endung .jpg abspeichern und Windows so konfigurieren, dass JPEGs mit unserem Music Player geöffnet werden. Wir hätten zwar ein grosses Chaos, würden aber auch schnell merken, dass die Dateiendung nichts über eine Datei aussagt. Also nutzen wir unsere Freizeit doch für Klügeres, aber lesen dafür vorherigen Satz mindestens zehn Mal. Deal?

Obwohl du den Deal gebrochen hast, kehren wir zurück zum Thema und schauen uns an, wie eine Datei im Internet überhaupt lokalisiert und abgerufen werden kann.

URI, URL, wtf?

Im Internet ist jede Datei über einen eindeutigen Identifikator erreichbar. Dieser wird URI (Uniform Resource Identifier), oder - im Zusammenhang mit dem HTTP- und FTP-Protokoll - auch URL (Uniform Resource Locator), genannt.

Der Aufbau

Eine URL besteht aus folgenden Teilen:

Schema://[Benutzer[:Passwort]@]Server[:Port][/Pfad][?Anfrage][#Fragmentbezeichner]

Beispiele:

Der Schwindel

Ich habe da mal was vorbereitet ...

Schauen wir uns die Datei http://pub.bigwhoop.ch/faked-pic/CaptainObvious.jpg an.

CaptainObvious.jpg

Wie bereits durch die Dateiendung .jpg impliziert, erscheint ein JPEG-Bild. Das liegt allerdings nur daran, dass der Webserver (in unserem Fall ein Apache2 - merken für später!) bei der Auslieferung den Content-Type image/jpeg mitgeschickt und der Browser daraufhin die Daten als JPEG-Bild interpretiert hat.

Schauen wir als nächstes http://pub.bigwhoop.ch/faked-pic/CaptainObvious.mp3 an. Na los, klick schon drauf! Na, erstaunt? Da kam nicht etwa eine MP3-Datei, sondern das selbe JPEG-Bild wie vorher.

Schuld daran ist diese eine kleine Zeile innerhalb eines .htaccess-Files auf dem Server:

AddType image/jpeg .mp3

Dadurch weist der Webserver alle Dateien mit der Endung .mp3 mit dem MIME-Type image/jpeg aus. Und da haben wir auch schon das nächste Stichwort ...

Der MIME-Type

Der MIME-Type, Internet Media Type oder auch Content Type bestimmt den Typ einer Datei im Internet. Dies ist nötig, da z.B. der Browser eben nicht wissen kann, welche Daten vom Server daher kommen, wenn wir http://pub.bigwhoop.ch/faked-pic/CaptainObvious.mp3 aufrufen. Auf die Dateiendung kann er sich ja, wie vorhin gelernt, nicht verlassen.

Zum Aufbau: Der MIME-Type ist aufgeteilt in zwei Teile ...

<Medientyp>/<Subtyp>

Der Medientyp kategorisiert die MIME-Types grob. Mögliche Medientypen sind z.B. image (für Bilder), text (für von Menschen lesbare Texte) oder audio (für Musikdateien).

Der Subtyp spezifiziert die Untermenge des Medientyps. Beispiele mit text: plain (für Klartext), html (für HTML 4.01 kompatiblen HTML-Code) oder css (für Cascading Style Sheets).

Eine Sache der Konfiguration

Wie wir bemerkt haben, wird der Typ einer Datei nicht durch ihre Endung, sondern durch ihren MIME-Type bestimmt. Damit der Webserver (Apache2, remember!) den richtigen MIME-Type mitschicken kann, unterhält er eine Liste von Assoziationen zwischen Dateiendungen und MIME-Types. Also ähnlich wie Windows eine Liste zwischen Endungen und Programmen besitzt. Bei einem Apache findet man diese Definitionen übrigens in der Datei mime.types. Hier ein Auszug ...

image/bmp            bmp
image/cgm            cgm
image/gif            gif
image/ief            ief
image/jpeg           jpeg jpg jpe
image/png            png

Damit haben wir jetzt eigentlich auch schon den Wert einer Dateiendung erörtert: Sie dient (lediglich) zur Herleitung von Verknüpfungen.

Thesenerhärtung

Kommen wir zurück auf das Bildbeispiel (http://pub.bigwhoop.ch/faked-pic/CaptainObvious.mp3) von vorhin. Anhand dessen will ich noch ein paar Beispiele aufzeigen, die versinnbildlichen, dass die Dateiendung (und damit übrigens auch der Dateipfad) keinen Aufschluss über den Typ einer Datei geben können.

Der Programmierer war's ...

Ein weiterer Weg um einen MIME-Type zu setzen ist die Verwendung einer Server-seitigen Programmier-/Scriptsprache. Hier ein kleines Beispiel in PHP.

// CaptainObvious.php
header('content-type: image/jpeg');
echo file_get_contents('CaptainObvious.jpg');

Dazu das Beispiel in der Praxis: http://pub.bigwhoop.ch/faked-pic/CaptainObvious.php.

CaptainObvious.php

URL Rewritting

Eigentlich jeder Webserver (meist durch Erweiterungen) bietet die Möglichkeit, URLs on-the-fly umzuschreiben. Unter Apache heisst das Ding z.B. mod_rewrite.

Am besten versteht man URL Rewritting anhand ein paar Beispielen:

# Alle .html-Seiten nach .php umschreiben                                
# Aus http://example.org/test.html wird http://example.org/test.php
RewriteRule ^(. ).php$ $1.html

# Schöne Produktelinks                                  
# Aus http://example.org/produkt-12.html wird http://example.org/product.php?id=12
RewriteRule ^product-([0-9] ).html$ product.php?id=$1

Zu beachten gilt, dass durch das Umschreiben der URL keine HTTP-Redirect gemacht wird. Der Browser wird also nicht auf eine andere Seite weitergeleitet. Dies zeigt sich auch dadurch, dass sich die Adressezeile des Browser nicht verändert.
Okay, dies gilt natürlich nur, solange sich die Domain nicht verändert. Wenn ich alle Anfragen von http://example.org auf http://example.net leite, muss der Browser gezwungenermassen eine neue Anfrage machen.

Fazit

Folgende Erkenntnisse solltet ihr jetzt erlangt haben:

Danke fürs Lesen! :-)

Ähnliche Artikel

Kommentare