Hi Thorsten,
Die CGI-Variable HTTP_REFERER kann ja problemlos mit jeder Sprache
ausgelesen werden.
mit dem Begriff "CGI-Variable" bin ich nicht so ganz glücklich.
Also mal ganz von vorn:
Ein HTTP-Request wird von einem Client an einen Server gesendet.
Dieser Request besteht aus (bis zu) zwei Teilen:
a) Einer Liste von Header-Zeilen (beendet mit einer Leerzeile) und
b) einem Body (der ggf. leer sein kann).
Der Webserver interpretiert diese Header-Zeilen _auch_ so, daß er den
Namen des jeweiligen Header-Feldes in Großbuchstaben umsetzt, '-' nach
'_' abbildet, "HTTP_" davor klebt und unter dem so entstandenen Namen
eine Environment-Variable anlegt. Aus dem HTTP-Header "Referer" wird
nun also eine Environment-Variable "HTTP_REFERER".
Dieses Verhalten ist in der Spezifikation der CGI-Schnittstelle fest-
gelegt (http://hoohoo.ncsa.uiuc.edu/cgi/env.html).
Diese Environment-Variable wiederum kann von einer serverseitigen
Anwendung angesprochen werden, wenn sie das Environment überhaupt
ansprechen kann.
Dies kann übrigens auch eine Datei sein, welche vom Handler für Server
Side Includes interpretiert wird - es muß kein CGI-Programm sein.
Apache bietet da eine ganze Menge selbst.
Nun habe ich vor kurzem ein Tutorial über das Spoofen diese
Referrers gelesen und weiß, daß es sogar extra "Spoofbrowser" gibt,
wo man den HTTP_REFERER selbst eingeben kann (z.B. DSpoof oder
ZSpoof oder M*Spoofer).
Jeder Client stellt einen Satz von HTTP-Headern nach seiner Wahl
zusammen. Er muß dabei bestimmte Anforderungen erfüllen (je nach
der verwendeten HTTP-Version), aber er hat weitgehende Freiheit,
was genau er sendet und was nicht.
Referrer beispielsweise sind Schall und Rauch - da ist es reiner
Zufall, wenn Browser A dasselbe tut wie Browser B. (Das gilt bei-
spielsweise nicht mal für Netscape 4 gegenüber M$IE 5.)
Daraufhin habe ich mich gefragt, wie das ganze funktioniert und
habe versucht, diese Variable mittel PHP, PYTHON und PERL zu setzen.
Das hat nicht funktioniert. Vielleicht habe ich es falsch gemacht.
Falls Du damit eine via CGI gestartete Perl-Anwendung etc meinst,
bist Du gerade am falschen Ende der Leitung. Dort ist der Request
ja bereits angekommen - da ist es zu spät, um noch daran zu drehen.
Du mußt vielmehr dort ansetzen, wo der Request gesendet wird. Das
_kann_ durchaus wiederum ein CGI/Perl- oder PHP-Programm sein, welches
in diesem Falle _sowohl_ Server- _als auch_ Client-Funktionen ausübt.
Kann mir jemand sagen, ob das möglich ist, dies irgendwie über ein
CGI-Script zu realisieren (und wenn ja: wie macht man dieses dann)?
Was _möglich_ ist, kannst Du Dir beispielsweise unter
http://www.schroepl.net/cgi-bin/http_trace.pl
ansehen und ausprobieren.
Das ist ein CGI-Skript (in Perl geschrieben, unter Verwendung von
LWP::UserAgent), welches Deinen HTTP-Request empfängt (über die oben
beschriebenen Environment-Variablen), dann selbst einen minimal
geänderten Request an den eigentlichen Ziel-Server sendet, dessen
Antwort empfängt und Dir über die gesamte Unterhaltung eine Ergebnis-
seite ausgibt.
Da die Funktion dieses Skripts ein Trace ist, übernimmt es die emp-
fangenen HTTP-Header so genau wie möglich - es könnte aber genauso
gut alles irgendwie umschreiben.
Ich habe schon stundenlang gegoogled, allerdings nichts mir
hilfreiches entdecken können.
Es gibt eine ganze Menge von Clients, die selbst HTTP-Requests
absetzen.
Das Beispiel, welches Deinem Szenario am ähnlichsten sein dürfte,
sind sogenannte Anonymizer. Die funktionieren im Prinzip genau wie
mein HTTP-Trace, mit zwei Unterschieden:
1. Sie liefern Dir die Seite des Ziel-Servers vollständig zurück,
ohne "Verzierungen" drum herum, und
2. sie parsen den Inhalt eines eventuellen HTML-Dokuments und
schreiben alle darin gefundenen Links in Aufrufe des Anony-
mizers mit entsprechenden Query-Strings um. Auf diese Weise
kannst Du Links in den empfangenen Seiten anklicken, ohne Dir
so recht bewußt zu werden, daß Du eigentlich gar nicht die
"echte" Seite vor Dir hast ... Du läßt den Anonymizer für Dich
surfen und schaust ihm praktisch nur über die Schulter.
Viele Grüße
Michael