Problem mit Wasserzeichen
Rollo
- php
Guten Morgen!
Mittels diverser image-funktionen erzeuge ich eine temporäre Bilddatei in der sich ein Wasserzeichen befindet. Das klappt alles soweit prima.
Mein Problem hierbei ist folgendes:
Die Php-Datei, in der das Bild nebst Wasserzeichen erzeugt wird, wird über eine andere php-Datei in der sich auch das html-Design usw. befindet, aufgerufen (auch um header-Probleme zu vermeiden).
Wer nun aber in meinen Quellcode guckt, kann den Aufruf nachvollziehen und die php-Bilderzeugungsdatei auch direkt aufrufen. Klar, das Wasserzeichen ist dann immer noch drin, aber ich möchte diesen direkten Aufruf unterbinden.
Meine Seite läuft über mehrere Domänen, aber die Haupt-php-Datei, welche die php-Datei die für die Bild/Wasserzeichen-Generierung verantwortlich ist, ist natürlich immer diesselbe.
Wie also, um auf den Punkt zu kommen, kann ich innerhalb der Bilderzeugungsdatei abfragen, ob sie direkt im Browser aufgerufen wurde oder ob der Aufruf durch die besagte Hauptdatei erfolgte?
Hallo,
Wie also, um auf den Punkt zu kommen, kann ich innerhalb der Bilderzeugungsdatei abfragen, ob sie direkt im Browser aufgerufen wurde oder ob der Aufruf durch die besagte Hauptdatei erfolgte?
zum Beispiel über eine Session.
Freundliche Grüße
Vinzenz
Hallo allerseits!
Ja, der Referer ist Quatsch. Und was hilft mir dann die Session?
Darin könnte ich doch nur den Referer ablegen und dann (erfolglos) in der 2. Datei abfragen.
Vielleicht ist der andere Ansatz ja erfolgreicher:
@Tom: Wie kann ich die Datei http-technisch blocken so daß sie mir für den Aufruf dennoch zur Vefügung steht?
Hello,
@Tom: Wie kann ich die Datei http-technisch blocken so daß sie mir für den Aufruf dennoch zur Vefügung steht?
Lege sie einfach außerhalb der Document Roots der verschiedenen Webserver (Virtual Hosts) ab.
Alternativ kannst Du auch ein Verzeichnis mit .htaccess schützen bzw. gewisse Dateien darin. Das ist aber nur einen Krückenlösung
Liebe Grüße aus dem Cyberspace
Tom vom Berg
Hi Tom!
Lege sie einfach außerhalb der Document Roots der verschiedenen Webserver (Virtual Hosts) ab.
Rollo möchte nicht die Bilddatei schützen, sondern das verarbeitende Skript, das die Datei ausgibt. Warum auch immer...
MfG H☼psel
Hello,
Lege sie einfach außerhalb der Document Roots der verschiedenen Webserver (Virtual Hosts) ab.
Rollo möchte nicht die Bilddatei schützen, sondern das verarbeitende Skript, das die Datei ausgibt. Warum auch immer...
Ja, so habe ich das verstanden. Er hat ein Extra-Script, dass er irgendwie (wie er das macht, ist er ja noch schuldig) in ein anderes einbindet. So aufgerufen ist er zufrieden. Allerdings können böse Menschen das Script auch direkt aufrufen. Das will er nicht.
Liebe Grüße aus dem Cyberspace
Tom vom Berg
Hi Tom!
Ja, so habe ich das verstanden. Er hat ein Extra-Script, dass er irgendwie (wie er das macht, ist er ja noch schuldig) in ein anderes einbindet.
Ich habe das so verstanden, dass er diese Bildskript auch als Bild einbindet und nicht über PHP inkludiert.
Rollo, gib´ mir mal Recht! =)
MfG H☼psel
Ja, du hast Recht, ich inkludiere die Datei nicht, sondern rufe sie über Parameter (siehe letztes Posting) auf.
Das Problem bei deinem Ansatz mit der Session und der Zufallszahl wäre aber doch, dass wiederum in Quellcode der Zufallswert mit lesbar wäre, da er ja auch via get als Parameter beim Aufruf drangehängt werden müßte ala:
Quellcodeauszug:
<img src="img.php?pic=cover/4323.jpg&width=235&myrandom=8432723897"></img>
Oder übersehe ich hier irgendwas gravierendes?
Hi Rollo!
Ja, du hast Recht, ich inkludiere die Datei nicht, sondern rufe sie über Parameter (siehe letztes Posting) auf.
Ha! =)
Das Problem bei deinem Ansatz mit der Session und der Zufallszahl wäre aber doch, dass wiederum in Quellcode der Zufallswert mit lesbar wäre [...]
Oder übersehe ich hier irgendwas gravierendes?
Nö, aber wo ist das Problem?
Jemand der diese URL einfach so aufruft, hat ja nicht die passende ID in seiner Session.
MfG H☼psel
Ok, vielleicht mache ich nur einen Denkfehler, aber bei dem Versuch das umzusetzen wird einfach gar kein Bild mehr aufgerufen.
Folgendes steht in der Hauptdatei (die mit dem Design, nenne ich jetzt einfach mal so)
session_start();
srand((double)microtime()*1000000);
$unique_str = md5(rand(0,9999999));
$_SESSION['referer'] = $unique_str;
echo "<img src="imgtest.php?pic=$derbg&width=$size1&myrandom=$unique_str"></img>";
Und folgendes steht in der Bildgenerierungsdatei:
header("Content-type: image/jpeg");
if ($myrandom != $_SESSION['referer'])
{
die;
}
Hilfe!!
Hi Rollo!
if ($myrandom != $_SESSION['referer'])
Du musst auch auf die vorher angelegte Session-Variable ($_SESSION['referer']
) zugreifen.
$myrandom
ist in dem Kontext der Bilderzeugungsdatei ja nicht mehr vorhanden.
MfG H☼psel
Hi !
"Du musst auch auf die vorher angelegte Session-Variable ($_SESSION['referer']) zugreifen."
Tue ich das denn nicht? Ok, offenkundig nicht...aber als newbie weiß ich nicht genau was du meinst:
Ich hatte angenommen ich mache das via
"if ($myrandom != $_SESSION['referer'])"
$myrandom sollte via get übergeben worden sein und der $_SESSION['referer'] sollte doch auch noch da sein.
Jetzt mal ganz dreist davon ausgehend, dass zumindest die Übergabezeilen und die Erzeugung des Zufallsstrings korrekt sind, was muss ich denn nun wie abfragen?
Hi Rollo!
$myrandom sollte via get übergeben worden sein [...]
Nur wenn register_globals an ist. Nutze lieber $_GET['myrandom']
.
[...] und der $_SESSION['referer'] sollte doch auch noch da sein.
Hast du session_start()
aufgerufen?
Jetzt mal ganz dreist davon ausgehend, dass zumindest die Übergabezeilen und die Erzeugung des Zufallsstrings korrekt sind, was muss ich denn nun wie abfragen?
$_GET['myrandom']
und $_SESSION['referer']
dürfen nicht leer und müssen identisch sein.
MfG H☼psel
Hi!
Ja, die globals sind an.
Die Parameter für den Bilddateinamen, die Größe etc. kommen ja auch an.
Die Bilderzeugungsdatei sieht nun inhaltlich (gekürzt) so aus:
<?php
header("Content-type: image/jpeg");
session_start();
if ($myrandom != $_SESSION['referer'])
{
die;
}
Das Bild wird korrekt generiert, allerdings auch noch "andererorts", sprich, die Routine hat bislang keinen Effekt.
Stimmt sonst irgendwas nicht mit den beiden scripten, das ich übersehe?
Hier noch mal der Aufruf aus der Hauptdatei:
<?php
session_start();
srand((double)microtime()*1000000);
$unique_str = md5(rand(0,9999999));
$_SESSION['referer'] = $unique_str;
echo "<img src="imgtest.php?pic=$derbg&width=$size1&myrandom=$unique_str"></img>";
...Schwere Geburt das...
Hi Rollo!
Ja, die globals sind an.
Schlecht. Schalte sie besser aus. Sie stellen ein Sicherheitsrisiko dar.
Das Bild wird korrekt generiert, allerdings auch noch "andererorts", sprich, die Routine hat bislang keinen Effekt.
Doch. Lösche die entsprechenden Session-Cookies und rufe das Bildskript noch einmal auf. Nur Nutzer, die deine Seite (genauer: die einbindende Seite, die auch die ID generiert) besucht haben, können das Bild sehen.
Stimmt sonst irgendwas nicht mit den beiden scripten, das ich übersehe?
Bis auf das Verlassen auf automatisch registrierte Variablen scheint alles in Ordnung zu sein.
MfG H☼psel
Hello,
Bis auf das Verlassen auf automatisch registrierte Variablen scheint alles in Ordnung zu sein.
Nö, so wie er es gebaut hat, würde das Bild auch angezeigt werden, wenn kein 'myrandom' mitgeschickt werden würde _und_ keine gültige Session besteht.
Er muss auf jeden Fall prüfen, ob der "referer" in der Session gesetzt ist.
Liebe Grüße aus dem Cyberspace
Tom vom Berg
Hi!
Ja, das war der entscheidende Hinweis und nun klappt es auch wunderbar!
Ich danke euch beiden vielmals für eure Hilfe, Tips und nicht zuletzt, eure Geduld! :)
Hi Tom!
Nö, so wie er es gebaut hat, würde das Bild auch angezeigt werden, wenn kein 'myrandom' mitgeschickt werden würde _und_ keine gültige Session besteht.
Er muss auf jeden Fall prüfen, ob der "referer" in der Session gesetzt ist.
Das hatte ich aber schon lange vorher geklärt. =)
MfG H☼psel
Hi!
Leider klappt es nicht. Ich habe alle Cookies und den cache gelöscht. Bin in einen Forenbeitrag gegangen, in dem ein Coverlink von mir zum Anklicken steht und nach Klick drauf wird das Bild aufgerufen!
Hello,
Hi!
Ja, die globals sind an.
Die Parameter für den Bilddateinamen, die Größe etc. kommen ja auch an.Die Bilderzeugungsdatei sieht nun inhaltlich (gekürzt) so aus:
<?php
header("Content-type: image/jpeg");
session_start();
if (isset($_GET['myrandom'], $_SESSION['referer'])
and ($_GET['myrandom'] == $_SESSION['referer']))
{
### alles OK, weitermachen
}
else
{
die($ersatzbild);
}
Das Bild wird korrekt generiert, allerdings auch noch "andererorts", sprich, die Routine hat bislang keinen Effekt.
Stimmt sonst irgendwas nicht mit den beiden scripten, das ich übersehe?
Hier noch mal der Aufruf aus der Hauptdatei:
<?php
session_start();
srand((double)microtime()*1000000);
$unique_str = md5(rand(0,9999999));$_SESSION['referer'] = $unique_str;
echo "<img src="imgtest.php?pic=$derbg&width=$size1&myrandom=$unique_str"></img>";...Schwere Geburt das...
Liebe Grüße aus dem Cyberspace
Tom vom Berg
Hello Hopsel,
Ja, so habe ich das verstanden. Er hat ein Extra-Script, dass er irgendwie (wie er das macht, ist er ja noch schuldig) in ein anderes einbindet.
Ich habe das so verstanden, dass er diese Bildskript auch als Bild einbindet und nicht über PHP inkludiert.Rollo, gib´ mir mal Recht! =)
Das habe ich inzwischen auch feststellen müssen.
Rollo ist sich hier scheinbar noch nicht darüber im Klaren, was der Unterschied ist zwischen
Man kann mit Einmal-Keys arbeiten.
Das Script bietetr die Ressource weiterhin an als 'img.php?k=Ab5_7zZx' oder auch gleich als 'Ab5_7zZx.gif' und trägt diesen Key zusammen mit einem Timestamp und dem Nmane der eigentolich Bilddatei in eine Datei außerhalb der Dokument Root ein.
Wenn nachher die Ressource angefordert wird, wird im Script als erstes überprüft, ob der Key überhaupt vorhanden ist, ob er noch frisch genug ist und eventuell auch noch, ob er schon einmal aufgerufen wurde. Dann kann die Bilddatei beschafft werden und weiter gehts es wie gewohnt.
damit 'Ab5_7zZx.gif' als PHP-Datei ausgewertet wird, kann man sie in ein spezielles Verzeichnis packen, in dem alle Files als PHP-Files ausgewertet werden. Das geht zur Not mal wieder mittels .htaccess und ForceType-Direktive http://httpd.apache.org/docs/2.2/mod/core.html#forcetype.
Der Client kann nun gar nicht mehr sehen, dass es sich nicht um ein Bild, sondern um ein Script handelt.
Liebe Grüße aus dem Cyberspace
Tom vom Berg
"Wie er das macht?"
Innerhalb meiner Hauptdatei erfolgt der Aufruf der Bildgenerierungsdatei:
echo "<img src="/cover/img.php?pic=$derbg&width=$size1"></img>";
Parameter für Bildgröße, Bilddatei usw. werden im Aufruf übergeben.
In der Bildgenerierungsdatei steht dann in der 1. Zeile der Header:
header("Content-type: image/jpeg");
Ja, und das Ganze mache ich, damit das Bild temporär erzeugt wird und ich keinen ftp-Ballast anhäufe.
Und falls jetzt jemand fragt: Warum temporär?
Weil die Original-Bildateien, auf die keiner Zugriff hat (wegen htaccess) kein Wasserzeichen besitzen und dieses eben in einen neuen, dafür temporär angelegten, Bildatei erscheint und angezeigt wird.
Falls diese Prozedur wider Erwarten innerhalb EINER Datei funktionieren sollte, ohne das ich Header-Probleme bekomme (header already been sent) oder das die Ausgabe danach abgeschnitten wird, würde ich auch gerne auf solch eine Alternative zurückgreifen!
Hi Rollo!
"Wie er das macht?"
Innerhalb meiner Hauptdatei erfolgt der Aufruf der Bildgenerierungsdatei:
echo "<img src="/cover/img.php?pic=$derbg&width=$size1"></img>";
Parameter für Bildgröße, Bilddatei usw. werden im Aufruf übergeben.
Das hättest du gleich erzählen sollen. Tom ist von anderen Voraussetzungen ausgegangen, weil deine Frage auch anders gedeutet werden kann. =)
Falls diese Prozedur wider Erwarten innerhalb EINER Datei funktionieren sollte, ohne das ich Header-Probleme bekomme (header already been sent) oder das die Ausgabe danach abgeschnitten wird, würde ich auch gerne auf solch eine Alternative zurückgreifen!
Nää! Das kriegst du nicht hin.
Aber nochmal die Frage: Warum ist es schlimm, wenn man das Bild mit Wasserzeichen auch einfach so aufrufen kann?
MfG H☼psel
Aber nochmal die Frage: Warum ist es schlimm, wenn man das Bild mit Wasserzeichen auch einfach so aufrufen kann?
Weil ich in bestimmten Foren leider sehr häufig Bilder von mir direkt verlinkt/angezeigt sehe, die auch als Dateianhänge (so wie eben auch in vielen Foren üblich) funktionieren würden.
Ich möchte halt, dass dies unterbunden wird und die Bilder nur im "Design" meiner Seite angezeigt werden! :)
Hello,
Aber nochmal die Frage: Warum ist es schlimm, wenn man das Bild mit Wasserzeichen auch einfach so aufrufen kann?
Weil ich in bestimmten Foren leider sehr häufig Bilder von mir direkt verlinkt/angezeigt sehe, die auch als Dateianhänge (so wie eben auch in vielen Foren üblich) funktionieren würden.
Ich kenne Leute, die tun alles dafür, dass sie beklaut werden und berechnen dann Lizenzgebühren. Das scheint ganz einträglich zu sein. Dazu müssen die Bilder aber auch wirklich gut oder einzigartig sein.
Liebe Grüße aus dem Cyberspace
Tom vom Berg
Hello,
Innerhalb meiner Hauptdatei erfolgt der Aufruf der Bildgenerierungsdatei:
echo "<img src="/cover/img.php?pic=$derbg&width=$size1"></img>";
Der Aufruf erfolgt nicht innerhalb Deiner Hauptdatei, sondern wird von ihr als abhängiger Folgerequest an den Browser ausgeliefert. Die Anforderung der ressource findet dann also doch wom Client aus statt.
Dann hat Hopsel natürlich Recht, dass dieses Script 'img.php' über HTTP erreichbar bleiben muss.
Dann bleiben Dir also nur Session, Einmal-Key und ähnliche Verfahren.
Liebe Grüße aus dem Cyberspace
Tom vom Berg
Hallo!
Ich habe doch erklärt warum.
Ich möchte nicht, dass das Script zur Bilderzeugung außerhalb der Hauptseite aufgerufen werden kann und das kann ich via htaccess erreichen.
Wenn ich das Generierungsscript einfach in dem ohnehin schon via htaccess geschützten Bilderordner lege, sollte das klappen. Kann ich aber erst am Feierabend ausprobieren...
Hallo!
Ich denke, ich werde mal mein Glück mit dieser "Krückenlösung" versuchen, danke sehr!
Hi Rollo!
Ich denke, ich werde mal mein Glück mit dieser "Krückenlösung" versuchen, danke sehr!
Es wird nicht funktionieren. Du kannst zwar die zu verarbeitende Bilddatei außerhalb des Document-Roots ablegen, aber das verarbeitende Skript muss über HTTP erreichbar bleiben. Sonst hast du keine Möglichkeit, das Wasserzeichenbild in eine Seite einzubinden.
Die Hauptfrage, die immer noch besteht, ist warum du das überhaupt machen möchtest?!
Der Ansatz über eine Session würde nicht über den Referer funktionieren. Stattdessen vergibst du bei jedem Seitenaufruf der Anzeige-Ressource eine Zufalls-ID bzw. -Zahl, die du in der Session speicherst.
Des weiteren wird diese ID an das Bildskript über einen GET-Parameter übergeben.
Das bilderzeugende Skript vergleicht die ID aus der Session mit der ID aus dem GET-Parameter und reagiert bei Fehlen oder Ungleichheit entsprechend.
MfG H☼psel
Hi,
Der Ansatz über eine Session würde nicht über den Referer funktionieren. Stattdessen vergibst du bei jedem Seitenaufruf der Anzeige-Ressource eine Zufalls-ID bzw. -Zahl, die du in der Session speicherst.
Des weiteren wird diese ID an das Bildskript über einen GET-Parameter übergeben.Das bilderzeugende Skript vergleicht die ID aus der Session mit der ID aus dem GET-Parameter und reagiert bei Fehlen oder Ungleichheit entsprechend.
Wozu *noch* eine zufällige ID?
Die Session-ID stellt bereits eine solche dar.
MfG ChrisB
Hello,
Wozu *noch* eine zufällige ID?
Die Session-ID stellt bereits eine solche dar.
Ich vermute, dass das jetzt eine rhetorische Frage sein sollte.
Na, dann zeig mal, wie Du es machen würdest. :-)
Liebe Grüße aus dem Cyberspace
Tom vom Berg
Hi Tom!
Wozu *noch* eine zufällige ID?
Die Session-ID stellt bereits eine solche dar.
Ich vermute, dass das jetzt eine rhetorische Frage sein sollte.
Na, dann zeig mal, wie Du es machen würdest. :-)
Er hat schon recht: Wenn ich mich auf der Anzeigeseite befinde, wird eine Session-Variable angelegt. Rufe ich das Bildskript einfach so auf, gibt es diese Variable nicht. Ich bin also gezwungen, erst die anzeigende Seite zu besuchen.
MfG H☼psel
Hi ChrisB!
Das bilderzeugende Skript vergleicht die ID aus der Session mit der ID aus dem GET-Parameter und reagiert bei Fehlen oder Ungleichheit entsprechend.
Wozu *noch* eine zufällige ID?
Gute Frage. =)
Die Session-ID stellt bereits eine solche dar.
Richtig.
Dann braucht man noch nichtmal eine zufällige ID. Es reicht, in einer Session einen boolschen Wert zu speichern, den man mit empty() auswertet.
MfG H☼psel
Hi,
Wer nun aber in meinen Quellcode guckt, kann den Aufruf nachvollziehen und die php-Bilderzeugungsdatei auch direkt aufrufen. Klar, das Wasserzeichen ist dann immer noch drin, aber ich möchte diesen direkten Aufruf unterbinden.
autsch. Herzlich willkommen in der wunderbaren Welt von HTTP.
Wie also, um auf den Punkt zu kommen, kann ich innerhalb der Bilderzeugungsdatei abfragen, ob sie direkt im Browser aufgerufen wurde oder ob der Aufruf durch die besagte Hauptdatei erfolgte?
HTTP kennt kein "von". Falls Dir jemand dazu rät, den Referer zu verwenden: Ignoriere ihn, er gibt Dir einen äußerst schlechten Rat.
Cheatah
Hello,
ich verstehe zwar Deinen Knoten nicht ganz, aber warum stellst Du die empfindliche Datei überhaupt per HTTP zur Verfügung? Wenn sie nicht per HTTP zur Verfügung steht, kann sie nicht mehr direkt vom Client angefordert werden, aber immer noch serverintern über das Dateisystem.
Liebe Grüße aus dem Cyberspace
Tom vom Berg