leider nützt das Skript das die Bilder vor dem unbefugten speichern Schützen sollte nicht viel. Wie bei meisten dieser Skripts gibts hier einen einfachen Trick:
- Rechte Maustaste gedrückt halten
- Dialog (Copyright....) mit Return schließen
- anschließend die rechte Maustaste wieder loslassen.
=> Schwupp das Context-Menü ist da
Gibts keine Abhilfe? Wer hat ne Idee das besser zu schützen?
Ich sichere nur kleine Firmennetzwerke keine Bilder
trotzdem hab ich eine Methode:
1. Verzeichnis schützen
Schützen sie Ihr Verzeichnis mit einer .htaccess Datei.
(leere Datei oder Errordokumentangabe)
2. Grafik anzeigen
Das Script zum Anzeigen der Grafik zeigt das Bild mit
Hilfe einer Tabelle an. Der Trick: Das eigentliche Bild wird als
Hintergrundbild eingebaut, als Inhalt für die Tabellenzelle verwenden
wir ein transparentes Gif. Somit ist das Abspeichern der Grafik
per Rechts-Klick auch unterbunden.
Der Trick in Html:
<table CELLSPACING=0 CELLPADDING=0 COLS=1 WIDTH="100" HEIGHT="100">
<tr><td BACKGROUND="ihrbild.gif">
<img SRC="transparent.gif" height=100 width=100>
</td></tr></table>
Dieses Wissen verwenden wir nun in den PHP Dateien:
Quellcode "view_image.php":
<?php
session_start();
// Cache deaktivieren
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") ." GMT");
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate");
// Challenge-ID
mt_srand((double)microtime()*1000000);
$random = mt_rand();
$random = md5(uniqid($random,TRUE));
$sess_challenge_id = $random;
if(!session_is_registered("sess_challenge_id")):
session_register("sess_challenge_id");
endif;
// Grafik auslesen
$pic = "tolle-grafik.jpg";
$img = @GetImageSize("/absoluter/pfad/zu/verzeichniss/images/".$pic);
$width = $img[0];
$height = $img[1];
// HTML-Tabelle anzeigen
printf("<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"%s\" height=\"%s\">\n",$width,$height);
print "<tr>\n";
printf("<td width=\"%s\" height=\"%s\" background=\"read_image.php?img=%s&challenge=%s\">",$width,$height,rawurlencode($pic),$sess_challenge_id);
printf("<img border=\"0\" src=\"blind.gif\" width=\"%s\" height=\"%s\">",$width,$height);
print "</td>\n";
print "</tr>\n";
print "</table>\n";
?>
Erklärung:
Als allererstes müssen Sie eine Session starten.
Danach deaktivieren Sie sicherheitshalber noch den
Cache und erzeugen eine 32 Zeichen lange "Challenge-ID".
Solche Challenge-ID's kann man übrigens auch gut verwenden,
um beispielsweise Reloads zu erkennen.
Diese Challenge-ID registrieren wir als Session-Variable.
Nun müssen Sie nur noch mit GetImageSize()
die Grösse der Grafik auslesen.
Nun kommt der eigentliche Trick:
Anstatt die Grafik direkt einzusetzen,
starten wir dagegen ein zweites Script
"read_image.php" und hängen als GET-Parameter
den Namen der Grafik-Datei und unsere
Challenge-ID hinten dran.
3. Grafik auslesen:
Nun benötigen Sie ein zweites Script, um Ihre
Grafik aus dem geschützten Verzeichnis auszulesen.
Der Quellcode dazu sieht folgendermaßen aus:
<?php
session_start();
// Challenge-ID OK -> Bild anzeigen
if(session_is_registered("sess_challenge_id") and $sess_challenge_id == $challenge):
session_unregister("sess_challenge_id");
$path = "/asoluter/pfad/zu/verzeichniss/images/";
$img = rawurldecode($img);
$read = @GetImageSize($path.$img);
$type = $read[2];
// Nun bestimmen wir den Datei-Typ, damit wir dem Browser sagen können
// welcher Grafik-Typ er nun vorgeschmissen bekommt
switch($type)
{
case 1:
$mime = "image/gif";
break;
case 2:
$mime = "image/jpeg";
break;
case 3:
$mime = "image/png";
break;
case 4:
$mime = "application/x-shockwave-flash";
break;
}
// Nun senden wir die Header und lesen mit readfile() unsere
// Grafik aus und senden diese direkt an den Browser
header("Content-Type: $mime");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate");
readfile($path.$img);
// Unerlaubter Zugriff -> Transparentes GIF *ätsch*
else:
header("Content-type: image/gif");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") ." GMT");
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate");
readfile("blind.gif");
endif;
?>
Als erstes überprüfen Sie, ob Ihre Session-Variable
registriert wurde und wenn ja, ob diese mit der übermittelten
Variable "challenge" übereinstimmt. Ist dies der Fall,
befreien Sie zuerst Ihre Session-Variable,
damit man die URL nicht per Copy & Paste aus dem
Quelltext in den Browser übernehmen kann.
Danach bestimmen Sie wieder mit GetImageSize() den
Grafiktyp, damit Sie dem Browser die richtigen Header übermitteln können.
Nun müssen Sie nur noch die Grafik per readfile() direkt an den Browser senden.
Falls jedoch keine Session-Variable registriert wurde bzw.
die beiden Challenge-ID's nicht übereinstimmen,
wird lediglich ein transparentes Gif ausgelesen und angezeigt.
Fassen wir das Ganze noch einmal zusammen und sehen uns an,
auf welche Arten unsere Grafik geschützt wurde:
Verzeichnisschutz per .htaccess
-> kein Zugriff per Browser
Grafik als Tabellen-Hintergrund mit transparentem Gif als Inhalt
-> beim Speichern wird nur das transparente GIF abgespeichert
Session-Variable wurde nicht registriert bzw. Challenge-ID's stimmen nicht überein
-> transparentes Gif wird angezeigt
Somit sind die Bilder vor so gut wie allen bekannten Zugriffs-
methoden sicher.
Ach ja - Jan - falls du das liest, ich würde niemals verlangen das du sowas ganz einbindest, aber den HTML-Trick von 2., wie würde man den
am besten in 4images umsetzen?
greets, phil