Anzeige
Tutorialbeschreibung

Schutz der Bilder vor externem Verlinken

Schutz der Bilder vor externem Verlinken

Hier zeige ich euch, wie ihr eure Bilder vor externem Verlinken schützen könnt. Falls das Bild von einer externen Quelle aufgerufen wurde, wird ein Hinweistext eingeblendet.


Schritt 1:
Als erstes legt ihr eine neue PHP-Datei an. Bei mir heißt sie image.php.

Darin schreibt ihr zu Beginn folgenden Code:

<?php
    $url = "http://127.0.0.1/test/";
    $imgdir = "images/";


In der Variable url steht die Adresse der Homepage, z.B http://127.0.0.1/test/. Was aber mehr zu empfehlen ist, ist das http:// wegzulassen, denn meistens ist es möglich, eine Seite mit und ohne www. aufzurufen und da das Skript bei dem einen ein externes Linken vermuten würde, stimmt die Überprüfung ohne http:// bei beiden Fällen.
In der imgdir-Variable kommt das Bilderverzeichnis, relativ zu dem Skript, dass wir nun programmieren, gesehen.

Schritt 2:
Als nächstes wir überprüft, ob überhaupt ein Bild angegeben wurde.

    if(!isset($_GET['img'])) {
        die("No image defined.");
    } else {
        $img = $imgdir.$_GET['img'];
    }


Das Bild wird über $_GET['img'] definiert (Skriptaufruf über image.php?img=test.jpg). Wenn es nicht existiert, bricht das Skript ab und gibt eine Fehlermeldung aus, ansonsten wir aus dem Bilderverzeichnis, das in Schritt 1 definiert wurde, und der übergebenen img-Variable die Bildadresse gebildet.

Schritt 3:
Im nächsten Schritt überprüfen wir, ob das gewählte Bild existiert.

    if(!file_exists($img)) {
        die("Image doesn't exist.");
    }


Ist dies nicht der Fall, wird das Skript wieder abgebrochen.

Schritt 4:
Als nächstes lesen wir mithilfe der Funktion getimagesize den Typ des Bildes aus.

    $info = getimagesize($img);

Schritt 5:
Nun überprüfen wir den eben ausgelesenen Bildtyp. Dies funktioniert für jpg, png und gif, für alle anderen Dateitypen wird das Skript hier zu Ende sein, da PHP keine Bildfunktionen dafür hat.

    if($info[2] == 1) {
        $mime = "image/gif";
        $pic = imageCreateFromGIF($img);
    } elseif($info[2] == 2) {
        $mime = "image/jpeg";
        $pic = imageCreateFromJPEG($img);
    } elseif($info[2] == 3) {
        $mime = "image/png";
        $pic = imageCreateFromPNG($img);
    } else {
        die("Invalid File-Type");
    }

Schritt 6:
Nun kommt der wichtigste Teil: Die Überprüfung, ob das Skript von einer externen Seite oder nicht aufgerufen wurde.

    if(!ereg($url, $_SERVER['HTTP_REFERER']) AND $_SERVER['HTTP_REFERER'] != "" AND !ereg('thumb', $img)) {

Als Erstes wird überprüft, ob die URL im Referer vorkommt. Dann, ob der Referer leer ist. Dies ist nämlich dann der Fall, wenn z.B. in Firefox ein Bild über Rechtsklick > Grafik anzeigen aufgerufen wird. Zu letzt wird überprüft, ob in der Bildurl thumb vorkommt. Denn es macht sehr wenig Sinn, Vorschaubilder zu schützen.
Wenn ihr irgendeine Überprüfung nicht wollt, dann löscht sie einfach raus.

Schritt 7:
Nun wird eine Nachricht auf das Bild geschrieben:

        $color = imagecolorallocate($pic, 0, 0, 0);
        ImageTTFText($pic, 10, 0, 20, 20, $color, "arial.ttf", "visit http://www.meineseite.ch");
    }


Die Funktion ImageTTFText von links nach rechts: Das Bild, auf den der Text geschrieben werden soll (erstellt in Schritt 5); die Textgrösse; der Winkel; x-Position von der linken oberen Ecke aus; y-Position von links oben; die Farbe (eine Zeile zuvor definiert); die Schriftart; der Text, der geschrieben wird.
Zur Schriftart: Diese muss am angegeben Ort existieren, ansonsten wird das Skript hier eine Fehlermeldung ausgeben.
Zum Text: Hier könnt ihr zwischen die " schreiben, was immer ihr wollt. Ihr müsst nur beachten, dass bei kleineren Bildern möglicherweise nicht alles draufpasst. Für einen Zeilenumbruch schreibt ihr .

Hier ein Beispiel für einen "komplexeren" Text:
"(C) by Kevin Egger visit: ".$url." Referer: ".$_SERVER['HTTP_REFERER']
Dies wird folgendes ausgeben:
(C) by Kevin Egger

visit:
[Die in Schritt 1 definierte URL]
Referer: [Der Referer]

Schritt 8:
    header("Content-Type: ".$mime);
    if($info[2] == 1) {
        imagegif($pic);
    } elseif($info[2] == 2) {
        imagejpeg($pic);
    } elseif($info[2] == 3) {
        imagepng($pic);
    }
   
    imagedestroy($pic);
?>


Die oberste Zeile bewirkt, dass der Browser auch weiß, dass es ein Bild ist und keine HTML-Datei.
In den nächsten Zeilen wird das Bild erstellt.

Mögliche Probleme und Nachteile:

  • Dadurch, dass die Bildurl direkt in der Adresse mitgeteilt wird, kann durch Erraten das Schutzskript umgangen werden. Dies kann jedoch durch einen .htaccess-Passwortschutz verhindert werden, was wieder zu Problemen führt, wenn ein Bild ohne das Schutzskript von der Ursprungsseite aus aufgerufen wird.
  • Falls es jemand schafft, seinen Referer so abzuändern, dass es mit der Page-URL übereinstimmt.
  • Dadurch, dass beim Aufruf eines Bildes zuerst ein PHP-Skript durchlaufen wird, steigt die Ladezeit leicht an. Zudem muss der Server mehr arbeiten.
  • Der Coder muss mehr schreiben.
  • Die Schrift kann nicht immer gelesen werden, das ist vom Hintergrund des Originalbildes abhängig.
  • Animierte .gifs gehen nicht, Transparenz scheint aber zu funktionieren.

Der komplette Code:
<?php
    $url = "127.0.0.1/test/";
    $imgdir = "img/";
    
    if(!isset($_GET['img'])) {
        die("No image defined");
    } else {
        $img = $imgdir.$_GET['img'];
    }
    
    if(!file_exists($img)) {
        die("No image");
    }
    
    $info = getimagesize($img);
    
    if($info[2] == 1) {
        $mime = "image/gif";
        $pic = imageCreateFromGIF($img);
    } elseif($info[2] == 2) {
        $mime = "image/jpeg";
        $pic = imageCreateFromJPEG($img);
    } elseif($info[2] == 3) {
        $mime = "image/png";
        $pic = imageCreateFromPNG($img);
    } else {
        die("Invalid File-Type");
    }
    
    if(!ereg($url, $_SERVER['HTTP_REFERER']) AND $_SERVER['HTTP_REFERER'] != "" AND !ereg('thumb', $img)) {
        $color = imagecolorallocate($pic, 0, 0, 0);
        ImageTTFText($pic, 10, 0, 20, 20, $color, "arial.ttf", "(C) by Kevin Egger visit: ".$url." Referer: ".$_SERVER['HTTP_REFERER']);
    }
    
    header("Content-Type: ".$mime);
    if($info[2] == 1) {
        imagegif($pic);
    } elseif($info[2] == 2) {
        imagejpeg($pic);
    } elseif($info[2] == 3) {
        imagepng($pic);
    }
    
    imagedestroy($pic);
?>


Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von RadX
  • 01.02.2013 - 16:24

Sehr interessant und gut strukturiert!

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 26.09.2010 - 02:05

Vielen Dank für den Code!

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 19.01.2010 - 21:45

Wirklich klasse.
Vielen dank für die Erklärung;)

Portrait von breakdown
  • 09.01.2010 - 19:06

Klasse erklaert. Schritt fuer Schritt und mit Verstand durchgearbeitet.

Portrait von Destruction929
  • 28.12.2009 - 21:08

Das kann man auch sehr viel einfacher machen!

Portrait von no_username
Portrait von UltimateX
  • 08.11.2009 - 12:41

sehr gut erklärt und sehr praktisch Thx

Portrait von eLemEnTaL
  • 01.09.2009 - 11:17

schön beschrieben und die einzelnen Funktionen erklärt. Herzlichen Dank, solch ein Skript ist heutzutage sehr gut zu gebrauchen

Portrait von DrDongel
  • 22.08.2009 - 17:56

Ich sag danke - bin nicht besonders weit in PHP & co. und sowas hilf einen ungemein weiter...auch um die Thematiken weiter zu verinnerlichen !!! BigTHX

Portrait von D3ATH
  • 20.08.2009 - 11:27

Das ist spitze sowas brauchte ich noch um meine vorlagen zuschützen zumindest etwas aber es sind ja nicht alles solche leute die wissen wie man es um geht ^^

Portrait von Destruction929
  • 20.08.2009 - 03:36

Hätte man auch sehr viel leichter machen können =) =)

Portrait von epostar
  • 16.07.2009 - 21:40

wow danke hat mir echt geholfen.

Portrait von dragma
  • 21.05.2009 - 09:10

Hey das war ganz gut, PHP is Neu für mich, und mit solcher Tipps ist Praktisch zu lernen,

Besten Dank !

Portrait von joelschmid
  • 15.04.2009 - 23:07

Genial! Kann ich super für gebrauchen. Besten Dank!

Portrait von mfgleo
  • 29.10.2008 - 18:07

Also die Idee find ich mal richtig gut.

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 19.08.2008 - 12:39

schritt für schritt erklärt, und nicht nur den codeschnipsel reingeklebt wie viele es machen. super!

Portrait von kevin916
  • 06.04.2008 - 13:34

Ich hab gerade gesehen, dass in Schritt 7 nicht alles korrekt angezeigt wird.

KORREKTUR:
"Für einen Zeilenumbruch schreibt ihr ." muss zu "Für einen Zeilenumbruch schreibt ihr n."
(Das n fehlt.)

Falls es wieder nicht geht:
"Für einen Zeilenumbruch schreibt ihr einen Backslash und gleich danach ein kleines n."

Portrait von schluggy
  • 05.04.2008 - 22:32

Danke, sehr hilfreich.

Portrait von lupos
  • 05.04.2008 - 19:32

Sehr schön erklärt, Danke dafür

Portrait von Weichzeichner
  • 05.04.2008 - 15:07

Danke, danke, danke jetzt brauche ich nicht immer ein Dickes Wasserzeichen über meine Bilder legen. Zudem auch für den Laien (und ein solcher bin ich ^^) gut erklärt. 5 Sterne

x
×
×