Je nach Refer ein anderes Bild ausgeben

Hallo,

gleich zu Anfang: Bin ein absoluter PHP-Unwissender…meine einzigen Erfahrungen damit beziehen sich, dass ich mein Forum ein bisschen gehackt und meinen Wünschen angepasst habe.

Kommen wir zur Sache:
Ich will auf einer Seite ein Bild anzeigen (GIF). Dieses Bild soll aber je nach Seitenname (muss ausgelesen werden) anders sein, z.B. bei bla.de/a.php?blog=ich soll ein anderes Bild als bei bla.de/b.php?blog=ich angezeigt werden.
Leider kann ich auf der seite keine PHP-Befehle ausführen (da extern). Aber so weit ich weiß, ist es doch auch möglich, Bilder quasi per PHP zu verändern (sieht man ja bei diesen Foren-Signaturen die z.B. die IP anzeigen). Wie mache ich sowas also?
Nochmal zusammengefasst: Die Bilder im GIF-Format befinden sich bereits auf meinem Server und da soll auch das Script laufen. Die Bilder werden nur aufgerufen, müssten also nicht verändert werden. Aufgerufen wird das aber von einem anderen Server, auf dem ich keine PHP-Befehle ausführen kann und der Bildname halt immer der gleiche ist.

Mir wurde gesagt, ich solle den Refer auslesen und dann mit header() und readfile() arbeiten. Leider bringt mich das jetzt wirklich weiter, da ich ja nichtmal weiß, wie quasi in dem Bild PHP-Code einfüge oder wie man das halt überhaupt macht.

Bin für Lösung(sansätze) dankbar!

Gruß, Olaf

Nachtrag: Mein Lösungsansatz
Hallo,

ich habe bereits den Code, um eine dynamische Grafik ausgeben zu lassen:

Header("content-type: image/PNG");

$dx=180;
$dy=180;
$image=ImageCreate($dx,$dy);

$blue=imagecolorallocate($image, 0,33,99);

ImagePNG($image);
ImageDestroy($image);
?\>

Funktioniert so weit. Nun müsste man ihn dahingehend verändern, dass er je nach Refer ein andere Grafik öffnet.

Hallo,

Kommen wir zur Sache:
Ich will auf einer Seite ein Bild anzeigen (GIF). Dieses Bild
soll aber je nach Seitenname (muss ausgelesen werden) anders
sein, z.B. bei bla.de/a.php?blog=ich soll ein anderes Bild als
bei bla.de/b.php?blog=ich angezeigt werden.
Leider kann ich auf der seite keine PHP-Befehle ausführen (da
extern). Aber so weit ich weiß, ist es doch auch möglich,
Bilder quasi per PHP zu verändern (sieht man ja bei diesen
Foren-Signaturen die z.B. die IP anzeigen). Wie mache ich
sowas also?
Nochmal zusammengefasst: Die Bilder im GIF-Format befinden
sich bereits auf meinem Server und da soll auch das Script
laufen. Die Bilder werden nur aufgerufen, müssten also nicht
verändert werden. Aufgerufen wird das aber von einem anderen
Server, auf dem ich keine PHP-Befehle ausführen kann und der
Bildname halt immer der gleiche ist.

Mir wurde gesagt, ich solle den Refer auslesen und dann mit
header() und readfile() arbeiten. Leider bringt mich das jetzt
wirklich weiter, da ich ja nichtmal weiß, wie quasi in dem
Bild PHP-Code einfüge oder wie man das halt überhaupt macht.

Bin für Lösung(sansätze) dankbar!

du kannst bekanntlich mit $_SERVER[‚HTTP_REFERER‘] den referer auslesen. Hierzu muss aber gesagt werden, dass er durchaus leer oder auch falsch angegeben wird vom client -> keine zuverlässige Aussagemöglichkeit.

if ($\_SERVER['HTTP\_REFERER']=="...")
 {
 $filename = "images/first.jpg";
 }
else
 {
 $filename = "images/second.jpg";
 }
# usw.. 
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
?\>

Wenn der Client sowieso ein Bild erwartet ist es nochnichtmal nötig den richtigen Header zu liefern!

Gruss, Omar Abo-Namous

als „php unwissender“ kannst Du Dich nicht so wirklich bezeichnen…
Zumindest dann nicht, wenn das Forum nach Deinem „hacking“ (sofern es sourcecodemanipulation war und nicht nur das austauschen von configvariablen…

ansonsten würd’ ich den Ansatz eher anders durchführen…
Ich hab meine pic-scripte zwar leider grade nicht zur Hand, aber tendenziell würd ich glaub ich das Bild aus einer anderen Datei laden und den richtigen header voranschicken. Also garnicht erst mit gd Funktionen arbeiten. Bin mir im Moment nur nicht ganz sicher, ob das auch einwandfrei funktioniert…

Ansonsten müsstest Du hier das ImageCreate durch ein ImageCreateFromJPEG, ImageCreateFromPNG oder ImageCreateFromGIF ersetzen. php.net weiss mehr darüber…
Um es leichter anzugehen und nicht jedesmal einen anderen header ausgeben zu müssen würd ich dann aber wiederum dazu raten, ImagePNG oder besser ImageJPEG zu verwenden (IE macht manchmal mit png grafiken grausige Sachen…) natürlich mit dem dazu passendem header…

Die Datei, die Du mit ImageCreateFromJPEG ansprichst musst Du natürlich auch referenzieren - entweder im source code oder in einer Datenbank…
also nach art
if($_SERVER[‚HTTP_REFERER‘] == „bla.de/a.php?lalala“) $usethisimage = „Datei“;

HTH
Munich

1 Like

Stand der Dinge
Hallo,

@Omar:
Dein Code ist soweit fast richtig (die Servervariable die abgefragt wird, ist erstmal nebensächlich):

Header("content-type: image/JPEG");

if ($\_SERVER["REQUEST\_URI"]=="/dg.php") 
 { 
 $filename = "images/a.jpg";
 }
else 
 { 
 $filename = "images/b.jpg"; 
 }
$handle = fopen($filename, "r");
echo fread($handle, filesize($filename));
fclose($handle);
?\>

Nur gibt’s ein Problem:
Beim einbinden als Image, werden keinerlei (Server)variablen übergeben!
Kein Refer, Request-URI oder sonstiges.
Ziemlich blöd.
Gibt’s da einen Workaround?

ich denke nein.
dann sollte der referrer aber trotzdem da sein - nur ist der eben die Seite vor der Seite, die aufgerufen wurde…
Zuviel kannst Du da aber eh nicht machen denke ich.

Vielleicht solltest uns sagen, was du eigentlich machen willst. Dann können wir vielleicht weitersehen. Beim Aufruf des Bildes sollte ein Referer mitangegeben werden, man müsste nur ausprobieren, ob die aufrufende Datei oder die Datei von der man gerade kommt als referer gelten.

Gruss, Omar Abo-Namous

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

Hallo,

nu hab ich das ausprobiert und die Variablen sind alle da. Der referer ist die Seite, in der das Bild eingebunden wird. Wenn du nun in einem Forum dein Bild abhängig von der Forumsthematik machen willst, kannst du das bspw. so machen:

<?php header("Content-type: image/png");
$im = @imagecreate(250, 50) or die("Cannot Initialize new GD image stream"); $background\_color = imagecolorallocate($im, 255, 255, 255); $text\_color = imagecolorallocate($im, 233, 14, 91); imagestring($im, 1, 5, 5, $\_SERVER['HTTP\_REFERER'], $text\_color); imagepng($im); imagedestroy($im); ?\> Ein Beispiel kannst du hier sehen: [http://www.toomuchcookies.net/newtest.htm](http://www.toomuchcookies.net/newtest.htm) Gruss, Omar Abo-Namous
2 Like

aber…
ich verweise mal auf das da:
bla.de/b.php?blog=ich
aus dem Ursprungsthread. Das geht nicht…
Denn der query-string bleibt beim Server wo die Seite liegt…
Oder sollte ich mich da täuschen?

Im Moment kann ich jedenfalls nur nachvollziehen, dass dann als Rückgabe bla.de/b.php stünde…

Was ich machen will

Beim einbinden als Image, werden keinerlei (Server)variablen
übergeben!
Kein Refer, Request-URI oder sonstiges.
Ziemlich blöd.
Gibt’s da einen Workaround?

Das ist übrigens die Aussage von jemandem, der mir in Sachen PHP ein wenig Hilfestellung gibt und mit dem ich da rumprobiert habe.

Vielleicht solltest uns sagen, was du eigentlich machen
willst. Dann können wir vielleicht weitersehen. Beim Aufruf
des Bildes sollte ein Referer mitangegeben werden, man müsste
nur ausprobieren, ob die aufrufende Datei oder die Datei von
der man gerade kommt als referer gelten.

Also, ich habe einen Weblog bei einem externen Anbieter (myblog.de).
Dort kann man ein „Headerbild“ definieren, also ein Bild, was auf jeder Seite angezeigt wird. Leider ist das halt wirklich auf jeder Seite gleich, was ich aber nicht will. Mit den zur Verfügung stehenden Mitteln dort ist das nicht zu lösen.
PHP-Includes gehen dort nicht, hab’ ich schon probiert. Halt nur die Geschichte mit dem Einfügen als Image.

Die Startseite des Blogs dort hat das Format www.myblog.de/user bzw. http://www.myblog.de/showblog.php?blog=user und die Unterseiten heißen z.B. http://www.myblog.de/showarchiv.php?blog=user oder http://www.myblog.de/showpage.php?blog=user&id=40921
Ja und ich will halt, je nachdem von welcher Seite das Bild aufgerufen wird, ein anderes anzeigen lassen.
Das Script läuft dann übrigens auf *meinem* Server.

Hallo,

nu hab ich das ausprobiert und die Variablen sind alle da. Der
referer ist die Seite, in der das Bild eingebunden wird. Wenn
du nun in einem Forum dein Bild abhängig von der
Forumsthematik machen willst, kannst du das bspw. so machen:

<?php :header("Content-type: image/png");
$im = @imagecreate(250, 50) or die("Cannot Initialize new GD image stream"); $background\_color = imagecolorallocate($im, 255, 255, 255); $text\_color = imagecolorallocate($im, 233, 14, 91); imagestring($im, 1, 5, 5, $\_SERVER['HTTP\_REFERER'], $text\_color); imagepng($im); imagedestroy($im); ?\>

Danke, das ist schonmal sehr nützlich und funktioniert auch, der richtige Refer wird jeweils angegeben.
Nur will ich ja halt keinen Text ausgeben :smile:
Ist nur komisch, dass das Script dessen Quellcode ich ja gezeigt habe, nicht funktioniert.

Hallo,

Also im referer steht die gesamte URL mit den get-variablen! Diese kannst du entweder über php auslesen oder über SSI:

Du kannst natürlich auch beim Aufruf deines Bilder folgendes machen:

"\>

Dann wird der querystring ausgegeben, der hinter dem seitennamen in der url eingegeben wurde!

Dazu muss aber unbedingt SSI (server side include) auf dem zielserver installiert sein!

Gruss, Omar Abo-Namous

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

Weiss nicht warum, wie dem auch sei, wenn du schon den referer hast, kannst du nun damit arbeiten, wie mit ner normalen Variable! Dies war bisher nur ein Test. Sag bescheid, wenn du dabei noch Hilfe benötigst.

Gruss, Omar Abo-Namous

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

Beim einbinden als Image, werden keinerlei (Server)variablen
übergeben!
Kein Refer, Request-URI oder sonstiges.
Ziemlich blöd.
Gibt’s da einen Workaround?

Das ist übrigens die Aussage von jemandem, der mir in Sachen
PHP ein wenig Hilfestellung gibt und mit dem ich da
rumprobiert habe.

Ich wusste auch bis kurzem nicht, dass es einen referer zu einem bildaufruf gibt, ist aber eigentlich logisch. Wie dem auch sei, ich wäre vorsichtig, denn das kann auch vom browser abhängen. Ich habe weiter unten einen Alternativvorschlag mit SSI gemacht. Wenn myblog.de SSI unterstützt, wäre das die ideale Methode m.E…

Gruss, Omar Abo-Namous

Es scheint jetzt zu funktionieren!
Hallo zusammen nochmal,

ich hab nochmal ein wenig rumgebastelt, und nun scheint es zu funktionieren.
Wahrscheinlich lag’s daran, dass ein „Break“ fehlte, denn so funzt es scheinbar recht zuverlässig (noch am testen):

<?php Header("content-type: image/JPEG");<br />
if ($\_SERVER['HTTP\_REFERER'] == "http://www.myblog.de/user")
 {
 $filename = "images/a.jpg";
 $handle = fopen($filename, "r");
echo fread($handle, filesize($filename));
fclose($handle);
 break;
 }
if ($\_SERVER['HTTP\_REFERER'] == "http://myblog.de/showblog.php?blog=user")
 {
 $filename = "images/a.jpg";
 $handle = fopen($filename, "r");
echo fread($handle, filesize($filename));
fclose($handle);
 break;
 }
else
 {
 $filename = "images/b.jpg";
 }
$handle = fopen($filename, "r");
echo fread($handle, filesize($filename));
fclose($handle);
break;
?\>

PS: SSI funzt übrigens nicht, aber das bräuchte ich nun auch nicht mehr.

Hallo,

kleine Verkleinerung des Quelltexts gefällig?

<?php Header("content-type: image/JPEG");<br />
if ($\_SERVER['HTTP\_REFERER'] == "http://www.myblog.de/user")
 {
 $filename = "images/a.jpg";
 }
elseif ($\_SERVER['HTTP\_REFERER'] == "http://myblog.de/showblog.php?blog=user")
 {
 $filename = "images/a.jpg";
 }
else
 {
 $filename = "images/b.jpg";
 }
$handle = fopen($filename, "r");
echo fread($handle, filesize($filename));
fclose($handle);
break;
?\>

das ist doch leserlicher und sollte mindestens genauso gut funzen!

Gruss und viel spass, Omar Abo-Namous

1 Like

Hallo,

kleine Verkleinerung des Quelltexts gefällig?

das ist doch leserlicher und sollte mindestens genauso gut
funzen!

Das hatte ich ja aber hier schon mal:
http://www.wer-weiss-was.de/cgi-bin/forum/showarchiv…
Und das hatte ja nicht gefunzt.

nu hab ich nachgeschut, aber da steht nur was von REQUEST_URI, was glaube ich einfach nur die Adresse des Bildes sein wird. Ich habs nun ausprobiert und es funktioniert:
Quelltext (test.php):

<?php Header("content-type: image/GIF");<br />
if ($\_SERVER['HTTP\_REFERER'] == "http://www.toomuchcookies.net/newtest.htm")
 {
 $filename = "images/ball\_button.gif";
 }
elseif ($\_SERVER['HTTP\_REFERER'] == "http://www.toomuchcookies.net/newtest.htm?blog=user")
 {
 $filename = "images/ball\_button.gif";
 }
else
 {
 $filename = "images/ball\_button\_off.gif";
 }
$handle = fopen($filename, "r");
echo fread($handle, filesize($filename));
fclose($handle);
break;
?\>

Hier zum ausprobieren:
http://www.toomuchcookies.net/newtest.htm

Wenn du eine Variable anhängst, dann sieht es anders aus:
http://www.toomuchcookies.net/newtest.htm?blog=user1

wäre auch komisch, denn beide Quelltexte sind exakt identisch in der Auswirkung!

Gruss, Omar Abo-Namous

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