Hallo,
Ich würde es bei einem Referer-Check durch den Server belassen und per Rewrite-Rule gegebenenfalls auf _kein_ Bild umleiten.
Leider setzt der IE 6.x keinen REFERER mehr.
Hmmm, verloren. :)
Den Traffic hat der Nutzer nämlich weiterhin, weil er ja ein anderes Bild schickt,
Mein Bekannter (der mit der Galerieseite) schickt auch kein Bild,
sondern ein header("Location: nirwana.irgendwo.hin");exit(0);
Das erzeugt natürlich auch noch zusätzlichen Traffic, weil der Browser jetzt erstmal einen Request an den DNS-Server des Userproviders schickt, bis er von der Nichtexistenz der Domain überzeugt wurde (so ungefähr jedenfalls).
Besser wäre es imho gar keine Umleitung, sondern eine leere Seite mit Status: 401 zu senden:
<?php
header('Status: 401');
?>
Dann kommt evtl. eine Warnmeldung, aber es wird kein weiterer, unnötiger Traffic erzeugt.
Das mit der IP, den Verschlüsselungen und dem Timeout sind in dem Fall imho nur Ballaststoffe. Eine Sessionfunktion ist übrigens schon in PHP eingebaut. ;)
Das ist allgemein bekannt.
Dann nutze sie. :) imho kann man Deinen Verschlüsselungsalgorithmus knacken, wenn man das Passwort errät. SessionIDs können bestenfalls nicht geraten werden, weil sie eine hinreichend zufällige Komponente enthalten.
Eine SessionID nach Deinem Muster erhalte ich aus der Zeit, dem Passwort und meiner IP. Zeit und IP sind mir - wie Dir - bekannt. Das Passwort kann ich "raten" und der MD5-Algorithmus steht mir zur Verfügung. Alles steht und fällt also mit dem Passwort.
Die Verwendung einer Session hat also imho eindeutig Vorteile gegenüber Deinem verfahren. Zur Verifikation müssen keine Daten übergeben werden, da die gültige SessionID serverseitig gespeichert wird. Alle nötigen Funktionen sind schon in PHP enthalten und es kommt keine konstante Komponente (Passwort) bei der Generierung der ID ins Spiel. Zudem kann auch zwischen zwei Zugriffen die IP sogar in den ersten beiden Stellen ruhig wechseln, ohne das der User abgelehnt wird.
Ungefähr so (ungetestet):
demo.php
<?php
session_start();
?>
<title>Bildausgabe</title>
<img src="image.php?src=bild.jpg&<%= SID; %>">
protect.php
<?php
$imgtypes = array('','gif','jpeg','png');
$sid = $_REQUEST['PHPSESSID'];
session_start();
if ( $sid != session_id() ) {
echo "Status: 401";
die( "Forbidden for ". $_SERVER['REMOTE_HOST'] );
}
else {
$image = preg_replace("/[^\w.-]/", "", $_REQUEST['src']);
$size = getimagesize($image);
// ab PHP4.3 geht auch: "Content-Type: {$size['mime']}"
header("Content-Type: " . $imgtypes[$size[2]]);
readfile($image);
}
?>
Imho ist das einfacher. :)
Gruß Alex