# Apache Modul: Direktaufruf von Bildern verhindern



## tefla (10. August 2005)

Hallo zusammen,

zuerst: ich hab schon gegoogelt.

Ich suche ein Modul, welches den direkten Zugriff auf Bilder verhindert und eine Umleitung bei Direktlink auf meine Homepage tätigt. Wenn das Bild irgendwo eingebettet ist, in eine Domain mit fremdem Inhalt, soll eine Anzeige des Bildes verhindert werden.

Hintergrund ist, dass ich mittlerweile riesen Traffic auf meiner Seite habe, durch Direktlinks oder Einbindungen in fremde Homepages. Wenn diese Homepages wenigstens meine Werbung miteinblenden würden *g*

Gibt es etwas in der Richtung ... oder weiss jemand Stichworte damit ich mir ein sinnvolles Modul schreiben kann?


----------



## Dr Dau (10. August 2005)

Hallo!

Erstell doch eine .htaccess:

```
AuthUserFile /dev/null
AuthGroupFile /dev/null
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://your.domain.com/
RewriteRule .*\.(gif|GIF|jpg|JPG|jpeg|JPEG|png|PNG)$
http://another.domain.com/for/picture/forbidden.png [R,L]
```
Auf your.domain.com liegen deine Bilder.
Auf another.domain.com liegt das Bild, welches bei Fremdverlinkung eingeblendet werden soll.
Da machst Du dann ein schönen Text drauf, z.b. "Der Betreiber dieser Seite hat das Bild von www.blabla.de geklaut".  

Gruss Dr Dau


----------



## Gumbo (10. August 2005)

Ob eine Ressource direkt oder indirekt angefordert wird, kannst du nicht herausfinden. Denn wenn ein Browser beispielsweise ein HTML-Dokument verarbeitet, in dem sich Grafiken befinden, werden diese auch direkt vom Browser und nicht etwa vom HTML-Dokument angefordert.
Soetwas ähnliches ist zwar mit Hilfe des HTTP-Referrers möglich, der je nach Einstellung immer dann bei Anfragen mitgesandt wird, wenn diese Bestandteil eines größeren Objektes (beispielsweise eins HTML-Dokuments) sind, jedoch ist auf diese Information kein Verlass. Denn einerseits wird diese Information nicht von jedem Browser selbstständig gesendet, da diese den Benutzer durchsichtiger machen kann, andererseits kann diese auch schnell verändert werden.

Wenn du dennoch eine Apache-Webserver-Lösung suchst, probier mal Folgendes:
	
	
	



```
RewriteEngine	On
RewriteCond	%{HTTP_REFERER}		!^$
RewriteCond	%{HTTP_REFERER} 	!^http://example.net/
RewriteRule	\.(gif|jpe?g|png)$	http://example.net/	[R,L]
```
Damit würde jede Anfrage des einer Ressource mit der einer typischen Erweiterung einer GIF-, JPEG- oder PN-Grafik auf http://example.net/ umgeleitet.


----------



## Dennis Wronka (13. August 2005)

Wenn die Bilder in Unterverzeichnissen liegen kannst Du ein wenig tricksen.
Um auf ein Bild zugreifen zu koennen benoetigt man den Namen.
Den bekommt man entweder durch ein Directory-Listing (wenn keine Index-Datei vorhanden ist und der Webserver entsprechend eingestellt ist) oder aus dem HTML-Code.
Falls der Server das Directory-Listing anzeigt wenn keine index.htm, index.html oder index.php vorhanden ist kannst Du entweder einfach eine leere index.html erstellen, oder sowas hier:
index.php

```
<?php
header("Location:../index.php");
?>
```
Dadurch wird dann zur index.php im uebergeordneten Verzeichnis umgeleitet.

Um nun noch zu verhindern, dass die Dateinamen aus dem HTML-Code gelesen werden koennen kann man auch wunderbar auf PHP zurueckgreifen.
Und zwar indem ein PHP-Script im <img>-Tag angegeben wird.
Das Script liest das Bild und stellt es dann dar. Am besten geschieht die Uebergabe der Bildinfo an das Script nicht ueber den Dateinamen, sondern z.B. eine ID aus einer Datenbank.
Wie hier:
imagefile.php

```
<?php
ob_start();
include("connectdb.php");
mysql_select_db($dbname,$db);
if (isset($_GET['id']))
	{
		$imageid=$_GET['id'];
	}
if (isset($imageid))
	{
		$images=mysql_query("select * from images where id='$imageid'",$db);
		$image=mysql_fetch_assoc($images);
		$galleries=mysql_query("select * from galleries where id='".$image['gallery']."'",$db);
		$gallery=mysql_fetch_assoc($galleries);
		header("Content-Type:image/jpeg");
		readfile("images/".$gallery['id']."_".$image['filename']);
	}
$db=mysql_close($db);
ob_end_flush();
?>
```

Und so sieht dann hier das <img>-Tag aus:

```
<img src="imagefile.php?id=<?php echo $image['id']; ?>">
```

So kannst Du dann auch den Dateinamen des Bildes verstecken.
Wenn Du nun noch ueberpruefst ob der User berechtigt ist das Bild zu sehen, z.B. mit einer auf Deiner Seite gestarteten Session duerfte es nichtmal mehr was dringen den Link direkt aufzurufen oder in einer anderen Website zu verlinken.


----------



## tefla (13. August 2005)

Die Idee ist mir auch schon gekommen, aber das heisst ja das ich die Pfade der Bilder ändern müsste ... und darauf hab ich bei der Masse keine Lust. 

Ich denke die Rewrite Rules sind das was ich brauche.

Erstmal vielen Dank für die Hilfestellungen, wenn es Probleme gibt meld ich mich.


----------

