Umleitung im HTTP-Datenstrom

Ich habe ein Script geschrieben, welches Bilder nur an vordefinierte Referer ausliefert, um Hot-Linking zu unterbinden.
Für nicht authorisierte Benutzer soll dabei entweder eine spezielle Bilddatei im Browser erscheinen (funktioniert anstandslos) oder eine Umleitung auf eine Fehlerseite erfolgen.
Nun habe ich aber das Problem, dass die normalen Redirects über CGI nicht funktionieren, da das Script mitten im HTTP-Datenstrom aufgerufen wird.
„Mitten im Datemstrom“ soll heißen, dass der Script-Aufruf nicht direkt über den Browser oder als Abschluss für ein Formular passiert, sondern innerhalb eines HTML-Tags mitten in einer HTTP-Sitzung.

Der langen Rede kurzer Sinn:

Der HTML-Code

Test

soll für erlaubte Benutzer das Bild test.gif anzeigen, für andere auf eine Fehlerseite umleiten. Das scheint mir aber mit den Content-Headers ein Problem zu machen.

Wer weiß Rat?

Grüße Luma

Hi Luma,

wahrscheinlich meinst Du das Ganze in etwa so:

SOC

#!/usr/bin/perl -wT
$IMGDIR = "/home/wwwrun/cgi-bin/test/";
$IMGFILE = $ENV{"QUERY\_STRING"};
print "Pragma: no-cache\n";
if ($IMGFILE =~ /\.gif$/i) {
 print "Content-type: image/gif\n\n";
} elsif ($IMGFILE =~ /\.jpg$|\.jpeg$/i) {
 print "Content-type: image/jpg\n\n";
} else { #Not a gif or jpeg file. Exit the program.
 exit(0);
}
open (BILD, $IMGDIR . $IMGFILE);
print ;
close (BILD);
exit(0);

EOC

Der Aufruf erfolgt entsprechend mit:

also ohne „image=“

Das Script ist bei mir (in etwas abgewandelter Form) für ein „Bild des Tages“ als Startbild im Einsatz.

Wichtig: das Script hat nur einen rudimentären Schutz (Abfrage GIF oder JPG). Um weitere Maßnahmen mußt Du Dich selber kümmern (Abfangen von „verbotenen“ Zeichen, Pfadüberprüfung etc.), da sonst Dein Server offen wie ein Scheunentor ist.

CU (M)ike

Hallo Mike!

Vielen Dank für Deine Antwort, aber das Script habe ich auf ähnliche Weise schon realisiert und läuft problemlos. Was mir Probleme bereitet, ist die Tatsache, dass ich zweierlei Schutzmechanismen realisieren möchte:

  1. Ein unerlaubter Besucher soll ein Fehlerbild ausgeliefert kriegen (schon realisiert).
  2. Ein unerlaubter Besucher soll auf eine andere Seite umgeleitet werden. Aber genau das scheint mir mit den üblichen Redirect-Mechanismen nicht zu funktionieren, da der Aufruf eben „mitten im Datenstrom“ passiert (siehe mein erstes Posting).

Grüße und vielen Dank!

Luma

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Luma,

da hatte ich Dich wohl etwas falsch verstenden…

  1. Ein unerlaubter Besucher soll ein Fehlerbild ausgeliefert
    kriegen (schon realisiert).
  2. Ein unerlaubter Besucher soll auf eine andere Seite
    umgeleitet werden. Aber genau das scheint mir mit den üblichen
    Redirect-Mechanismen nicht zu funktionieren, da der Aufruf
    eben „mitten im Datenstrom“ passiert (siehe mein erstes
    Posting).

das Problem liegt hier am Browser: wenn Du per IMG-Tag ein Bild anforderst, versucht er auch ein solches darzustellen - unabhängig vom Content-Type, den Du ihm übermittelst.
(kannst ja mal ein image/jpg oder text/html übermitteln und ein GIF-Bild schicken - es wird trotzdem richtig dargestellt, da der Browser selber den Bildtyp erkennt).

Abhilfe schafft hier nur:
1.) SSI - statt des direkten CGI-Bild-Aufrufs einfach per SSI-Direktive das CGI(PL) ausführen lassen und dann innerhalb des CGI Bild und Umleitung zu „streamen“ (z.B. indem Du die Fehlerseite ausgibst).
2.) das CGI direkt aufrufen und die notwendigen Ausgaben erzeugen.
3.) per User/Password-Abfrage und ErrorDocument-Eintrag auf ein entsprechend vorbereitetes (HTML-)Dokument umleiten.

Sonst wüßte ich im Augenblick auch nicht, wie man das (browserunabhängig) hinbekommt.

CU (M)ike

Hallo (M)ike!

Hab mir schon sowas gedacht, auch im Netz wird man nicht fündig. Werde mich daher über die SSI-Lösung den Kopf zebrechen!

Vielen Dank!

Luma

Ich habe ein Script geschrieben, welches Bilder nur an
vordefinierte Referer ausliefert, um Hot-Linking zu
unterbinden.
Für nicht authorisierte Benutzer soll dabei entweder eine
spezielle Bilddatei im Browser erscheinen (funktioniert
anstandslos) oder eine Umleitung auf eine Fehlerseite
erfolgen.
Nun habe ich aber das Problem, dass die normalen Redirects
über CGI nicht funktionieren, da das Script mitten im
HTTP-Datenstrom aufgerufen wird.
„Mitten im Datemstrom“ soll heißen, dass der Script-Aufruf
nicht direkt über den Browser oder als Abschluss für ein
Formular passiert, sondern innerhalb eines HTML-Tags mitten in
einer HTTP-Sitzung.

Der langen Rede kurzer Sinn:

Der HTML-Code

Test

soll für erlaubte Benutzer das Bild test.gif anzeigen, für
andere auf eine Fehlerseite umleiten. Das scheint mir aber mit
den Content-Headers ein Problem zu machen.

hmmm.
mal von vorn:
der browser holt eine htmlseite:

  1. http get /htmldatei

  2. content type text/html

  3. content

  4. fertig

  5. browser liest

  6. browser setzt wieder nen request:
    6.1. http get /img.pl
    6.2. content type img/jpg
    6.3 fertig

  7. browser stellt seite/img dar.

deine umleitung muesste an punkt 2 einspringen, nciht an punkt 6.2, wie es das tut, nach deiner bisherigen ausfuehrungen. also waere das sauberste die html datei von deinem script ausgeben zu lassen und zwar einfach nen "location: " einmal auf die richtige und zum anderen auf die „noentry“ oder aber im bild machst du einen "location: " auf das richtige bild, oder auf eines in dem steht „geh weg“.

vileicht habe ich dein problem auch nciht verstanden, weiss aber auf alle faelle cniht, wieso es mit ssi nciht auftreten solle…

Hallo dog.je!

Du hast recht, es werden wohl nur Variante 2 und 3 von Mike funktionieren. Nur ist das dann umständlich, weil ich am Quell-Code von bestehenden HTML-Dateien nicht allzuviel ändern möchte.

Grüße und vielen Dank!

Lumantil