Didi: Bild per PHP einlesen und ausgeben / Abrufschutz

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

  1. 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

    --
    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
    1. 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

      1. 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

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Hallo und danke @all !

          Stimmt, wenn ich über $_SESSION zugreife funktioniert das
          ganze wie geplant !

          Vielen Dank an alle !

          Gruss
          Didi

      2. 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

        --
        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
  2. 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

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  3. 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