Bild per PHP einlesen und ausgeben / Abrufschutz
Didi
- php
Hallo liebe Community,
so, auch ich habe (leider mal wieder) ein Problem, wo ich trotz
Google & Co. nicht so richtig weiterkomme:
Ich möchte innerhalb einer Webseite ein Bild ausgeben was aber
NICHT direkt durch den User (via Direkteingabe der URL) aufrufbar
sein soll. Hierfür habe ich eine entsprechende DB angelegt, in
dieser stehen u.a. die "richtigen" Dateinamen, so das ich mit einem
PHP-Script a'la "pic.php?id=XXX" über die ID den Bildnamen
abfragen kann und somit ebenfalls über die "pic.php?id=xxx" das
Bild somit EINLESEN und direkt wieder AUSGEBEN kann.
So weit, so gut.
Nun ist mein Problem dieses, das ich erstens nicht sicher bin,
ob mein Denkansatz nämlich das Bild per "fopen" einzulesen und
über mit neuem Header direkt zu senden sinnvoll ist, denn hierdurch
kann natürlich der User auch einfach direkt diese Datei
ansprechen und hat dennoch das Bild...
Zweitens macht mir bei einer solchen Lösung (wobei ich das Problem
noch zu lösen habe, das der User die "pic.php" nicht selber
aufrufen darf) die Serverlast ein wenig Kopfzerbrechen.
Daher hoffe ich, das jemand eine Idee hat wie ich meine
Probs gelösst bekomme bzw. eine bessere Idee für die Gesamtlösung.
Viele Grüsse
Didi
Hi,
Daher hoffe ich, das jemand eine Idee hat wie ich meine
Probs gelösst bekomme bzw. eine bessere Idee für die Gesamtlösung.
Beschäftige dich mit Sessions und sorge dafür, daß pic.php nur innerhab einer Session funktioniert.
Gruß, Cybaer
Hallo @all,
zuerst einmal kurz zu euren Antworten (für die ich mich natürlich
auch bedanken möchte):
@RFZ:
Die Lösung per .htaccess ist sicherlich ein guter Weg - nur
leider nicht für mich, da ich ich schon vor ein paar Wochen an
einem mod_rewrite versucht hatte; mit dem Ergebnis jetzt mindestens
10.000 graue Haare mehr zu haben. Da ich das ganze auch so
realisieren möchte, das es nach Möglichkeit unter nahezu jeder
Server-(Webspace-)konfiguration läuft (und ich auch verstehe, warum :-),
versuche ich jetzt erstmal den vorgeschlagenen Weg über Sessions.
@Cheatah:
Mein Problem ist, das ich zwar Bilder AUF MEINER HOMEPAGE (!) und
in meiner Seite anzeigen lassen will, aber ein Hotlinking, also
ein Direktaufruf über eine für den User ersichtliche URL
unbedingt unterbinden muß.
Bzgl. der Serverlast:
Meine Frage diesbezüglich war, ob der von mir ersannte Weg über
das Einlesen und Ausgeben via Script auch bei größeren Abfragemengen
sinnvoll ist, da über diesen Weg ja erst die Bilddatei serverseitig
verarbeitet wird (und nicht direkt ausgegeben).
@Cybaer:
Wie schon geschrieben ist der von dir vorgeschlagene Weg via
Sessions der für mich n.m.E. sinnvollste.
Ich habe dieses auch direkt versucht nach ein bissel Lektüre
umzusetzten, leider nur mit mäßigem Erfolg, da ich leider über
den (eigendlich beschriebenen) Weg keine Werte erhalte...
Daher meine Nachfrage an alle:
Ich nutze auf der "Grundseite" folgenden Code:
session_start();
$_SESSION["picid"] = $urid;
$_SESSION["zeit"] = time();
Das "Bild" binde ich mit:
<img border="0" src="pic.php">
ein.
Meine "pic.php" schaut momentan (auszugsweise) so aus:
session_start();
echo $picid;
echo $zeit;
if ($picid=="")
{
# Sessionschutz / keine Daten
die ("No picid");
}
$jetzt = time();
$diffzeit = $jetzt - 120;
if ($zeit > $diffzeit)
{
# Zeitschutz
die("No time");
}
# Ab hier würde die Auswertung der Daten erfolgen (Bildausgabe)
Nur leider kommt bei meiner "pic.php" nischt (keine Daten) an.
Weiss jemand warum nicht ?
Laut den Tuts müsste es doch so funktionieren, oder ?
Gruss
Didi
hi,
Nur leider kommt bei meiner "pic.php" nischt (keine Daten) an.
Weiss jemand warum nicht ?
Kontrolliere, ob die Session-ID beim Aufruf übergeben wurde.
gruß,
wahsaga
Hallo und danke @all !
Stimmt, wenn ich über $_SESSION zugreife funktioniert das
ganze wie geplant !
Vielen Dank an alle !
Gruss
Didi
Hi,
Laut den Tuts müsste es doch so funktionieren, oder ?
Nicht notwendigerweise. Z.B. solltest Du nicht mit $picid sondern mit $_SESSION (Stichwort: register_globals off) auf deine Variablen zugreifen (nachdem Du mit empty() ihre Existenz inkl. Inhalt ermittelt hast). Auch muß gewährleistet sein, daß pic.php die Session-ID überhaupt erfährt (Stichworte: keine Cookies erwünscht/session.use_cookies/Konstante SID/session.use_trans_sid).
Gruß, Cybaer
Hi,
Ich möchte innerhalb einer Webseite ein Bild ausgeben was aber
NICHT direkt durch den User (via Direkteingabe der URL) aufrufbar
sein soll. Hierfür habe ich eine entsprechende DB angelegt, in
dieser stehen u.a. die "richtigen" Dateinamen, so das ich mit einem
PHP-Script a'la "pic.php?id=XXX" [...]
so, jetzt muss ich erst mal zwischenfragen. Aus welchem Grund kann der User Deiner Meinung nach die URI "pic.php?id=XXX" nicht direkt eingeben?
Nun ist mein Problem dieses, das ich erstens nicht sicher bin,
ob mein Denkansatz nämlich das Bild per "fopen" einzulesen und
über mit neuem Header direkt zu senden sinnvoll ist,
Bisher hast Du nur einen Umweg eingebaut, von dem niemand außer Dir etwas merkt.
denn hierdurch
kann natürlich der User auch einfach direkt diese Datei
ansprechen und hat dennoch das Bild...
Nein, der User kann _keine_ Datei ansprechen. Sowas gibt's in HTTP nämlich nicht. Es gibt URLs, die zu Ressourcen führen. Punkt. Ob diese Ressource durch eine Assoziation mit dem Filesystem beim Server erzeugt wird oder durch eine serverseitige Script-Logik, ist absolut unerheblich.
Zweitens macht mir bei einer solchen Lösung (wobei ich das Problem
noch zu lösen habe, das der User die "pic.php" nicht selber
aufrufen darf)
Na, was soll er denn sonst machen? Entweder darf er es aufrufen, oder er erhält das Bild nicht.
die Serverlast ein wenig Kopfzerbrechen.
Um wie viel ist sie denn erhöht?
Daher hoffe ich, das jemand eine Idee hat wie ich meine
Probs gelösst bekomme bzw. eine bessere Idee für die Gesamtlösung.
Wie lautet denn eigentlich Dein Problem? Das lösbare, nicht widersprüchliche, meine ich.
Cheatah
Moin,
Ich möchte innerhalb einer Webseite ein Bild ausgeben was aber
NICHT direkt durch den User (via Direkteingabe der URL) aufrufbar
sein soll.
Das ist nicht so einfach, und vor allem sollte man deine Intention kennen. Eine Möglichkeit wäre die Prüfung des Referers, die aber nicht allzu zuverlässig ist.
Das Bild nur dann anzuzeigen, wenn der Referer eine URL deiner Website liefert wäre falsch. Die einzig sinnvolle Methode wäre, das Bild nicht zu zeigen, wenn der Referer eine andere URL als deine Website enthält.
Beispiel .htaccess für soeinen Schutz:
<FilesMatch ".(zip|exe|gif|jpe?g|png|swf|mp.|avi)$">
ErrorDocument 403 http://deine.website.de/deeplink.jpg
SetEnvIfNoCase Referer "^http://" blockuser
SetEnvIfNoCase Referer "^http://deine.website.de" !blockuser
SetEnvIfNoCase Referer "^http://www.deine.website.de" !blockuser
SetEnvIfNoCase Request_URI "deeplink.jpg$" !blockuser
Order Allow,Deny
Deny from env=blockuser
Allow from all
</FilesMatch>
Das wäre ein vernünftiger Schutz vor deeplinks.
Eine andere Möglichkeit wäre, wie du schon angefangen hast, über ein PHP Script. Dieses könnte so aufgebaut sein, dass es via Sessions überprüft ob der Benutzer innerhalb der letzen x Minuten auch eine Website von dir aufgerufen hat, oder doch nur die Bilder alleine. Ist zwar aufwändiger und auch weniger performant - aber du musst wissen ob es das wert ist, sicherer ist es auf jeden Fall.
Viele Grüsse
Didi
Schönen Gruß,
RFZ