Moin!
Wie irgendwo ;) gesagt, ich verschlüssele ja noch zusätzlich zur Session-Id eine Variable, um zu verhindern, dass irgendjd. die Verschlüsselung nachvollziehen kann. Das sieht eigentlich so aus:
$key = md5(session_id() . $bildbesitzer . $secret . $thumb);
Woher weiß show.php die Variable $secret? Ist die fest definiert? Dann hast du verloren!
Nur wenn sie pro Request bzw. pro Session neu definiert und als Session-Variable _nicht_ an den Browser übergeben wird, sondern auf dem Server verbleibt, bringt sie etwas.
Und show.php prüft diese Variable. Ich wüßte nicht, wieso es da ein Problem geben sollte... Um den gleichen Key zu bekommen müßtest Du alled diese Variablen kennen: die ID, die für das Bild als Besitzer in der DB eingetragen ist, die geheime Variable, den Namen des Bildes und die SessionID, und wissen, dass die Verschlüsselung so erfolgt...
show.php kriegt alle Informationen, die es prüft, per URL vom Client. Und da du die URLs natürlich dynamisch generierst und nur gültige URLs erzeugst, erlaubt allein die URL Zugriff - wenn in der URL ein Bestandteil versteckt wird, der einem beliebigen Client nicht bekannt ist, so wie z.B. ein dynamischer Anteil $secret, der sich pro Request oder zumindest pro Session verändert, und auch nicht von der Session-ID abhängt (die kann man zur Not aus dem Cookie auslesen und in die URL packen), sondern zufällig generiert wird und als Session-Variable den Server niemals verläßt - erst dann funkioniert dein Schutz.
Es geht hierbei nicht darum, wie du deinen MD5-Hash zusammensetzt, sondern wie du ihn auf Gültigkeit prüfst.
Du könntest auch ein Array als Session-Variable erstellen, in das du alle auszuliefernden Bilder einträgst, sobald der User sie abfordert. Wird das erste Bild in eine Seite eingebaut, wird z.B. $_SESSION['bilder'][0]='bildpfad/datei.gif' gesetzt. Und der Link zum show.php enthält nur die ID: "show.php?id=0". show.php weiß aufgrund der Session-ID jetzt, welches Bild zu laden ist. Und da die Session irgendwann einen Timeout hat, geht die Information, welches Bild hinter ID 0 steckt, irgendwann verloren. Man kann also nicht von extern aufs Bild linken.
Wenn du aber ohnehin einen Login-Mechanismus eingebaut hast, der das direkte, unangemeldete Verlinken von Bildern unmöglich macht - warum dann noch das Gehampel mit dem MD5-Hash etc.
Bedenke auch: Wenn du kein Directory-Listing erlaubt hast, kann man an ein Bild nur dann kommen, wenn man dessen URL kennt. Mit deinem Mechanismus kann man höchstwahrscheinlich auch an das Bild kommen, wenn man dessen URL kennt. Und im Zweifel kann man an die Bilder auch rankommen, indem der eine dem anderen das Bild mailt.
- Sven Rautenberg