Margrith: Bild mit .htaccess schützen

N'Abend allerseits

In einem Verzeichnis (z.B Fotos) liegt eine HTML-Datei, welche
die Bilder anzeigt, die im gleichen Verzeichnis liegen.

Meine Frage: Kann ich via .htaccess bestimmen, dass nur diese
eine HTML-Datei Zugriff auf diese Bilder hat?

Ich will damit verhindern, dass jemand diese Seite nachbaut und so die Bilder bei sich einbauen kann.
Ok, mir ist natürlich bewusst, dass man die Bilder auch so kopieren, abspeichern und in seine Seite einbauen kann! Ich will aber das "Automatisieren" unterbinden können.

Bisher habe ich unter den .htaccess-Anleitungen keinen Lösungsansatz gefunden. Darum wende ich mich an Euch und danke schon jetzt für jeden Hinweis!

Schöner Abend noch
Margrith

  1. hallo Margrith,

    Meine Frage: Kann ich via .htaccess bestimmen, dass nur diese
    eine HTML-Datei Zugriff auf diese Bilder hat?

    Nein. Die Bilder werden an einen aufrufenden Browser ausgeliefert, und nicht an eine "Datei". Du kannst Browser ausschließen, IP-Adressen ausschließen oder den Zugriff ganz sperren. Dann zeigt das HTML-Dokument bei dem Besucher, der es aufruft, eben anstelle der Bilder den im HTML-Code vorhandenen "alt"-Text an und keine Bilder.

    Ich will damit verhindern, dass jemand diese Seite nachbaut und so die Bilder bei sich einbauen kann.

    Das ist eine Illusion, von der du dich sehr rasch lösen solltest.

    Grüße aus Berlin

    Christoph S.

  2. Привет Margrith.

    In einem Verzeichnis (z.B Fotos) liegt eine HTML-Datei, welche
    die Bilder anzeigt, die im gleichen Verzeichnis liegen.
    Meine Frage: Kann ich via .htaccess bestimmen, dass nur diese
    eine HTML-Datei Zugriff auf diese Bilder hat?

    Du kannst mittels htaccess für einzelne Dateien oder Gruppen von Dateien eine Authentifizierung festlegen, siehe Verzeichnisse und Dateien schützen. Die _Seite_ zu schützen bedeutet nicht, auch die in diese Seite eingebundenen Ressourcen zu schützen. Dafür müsstest du dann doch das gesamte Verzeichnis schützen.

    Eine andere Möglichkeit wäre, anhand des Referrers zu selektieren, das könntest du mittels mod_rewrite erreichen. Thomas Luethi hat u.a. dazu mal eine Referrerprüfung mit mod_rewrite gepostet, vielleicht hilft dir das weiter.

    Alternativ kannst du im src-Attribut auch ein serverseitiges Script deiner Wahl angeben, welches die Referrerprüfung vornimmt und das entsprechende Bild ausliefert. Ein Beispiel für Perl findest du auf meiner Testseite.

    Sei dir aber bewusst, dass der Referrer nur eine Krücke ist, denn man kann den Referrer verfälschen oder ganz unterdrücken, was bei einer Prüfung zu falschen Ergebnissen führen kann. Fazit: du kannst Bilderklau nicht verhindern, nur erschweren.

    Дружба!
    Siechfred

    --
    Hinweis an alle Karnevalsmuffel: Aschermittwoch ist alles vorbei.
    1. Sei dir aber bewusst, dass der Referrer nur eine Krücke ist, denn man kann den Referrer verfälschen oder ganz unterdrücken, was bei einer Prüfung zu falschen Ergebnissen führen kann. Fazit: du kannst Bilderklau nicht verhindern, nur erschweren.

      Hallo Siechfred

      Genau, erschweren reicht schon aus! ;)
      Danke für Deine Hinweise.

      Grüsse
      Margrith

  3. Eine alternative Lösung mit PHP:

    Du kannst das Verzeichnis, in dem die Bilder liegen, mit .htaccess komplett für den HTTP-Zugriff sperren (wie hab ich vergessen, aber es geht).

    Dann legts du in einem anderen Verzeichnis eine PHP-Datei an, die über das _Dateisystem_ auf das Verzeichnis zugreift, das Bild holt und ausgibt (Content-type beachten!!).

    Um die Sache auf die Spitze zu treiben:
    Wenn die aufrufende Datei auch mit PHP (oder einer anderen Serverseitigen Scriptsprache) generiert wird, kannst du für jedes aufzurufende Bild eine ID und den Namen des Bildes in eine Datei schreiben. Die ID wird dann der "src" als GET übergeben.

    Das Script, welches die Bilder anzeigt, öffnet dann diese Datei, ließt den zur ID passenden Bildnamen aus, zeigt das Bild an und löscht den ID EIntrag aus der Datei.

    Dadurch ist der Zugriff auf die Bilder direkt nur möglich, wenn man schreibrechte auf dem Server hat.

    Allerdings ist es nicht weiter schwierig, ein Script zu schreiben, daß HTTP-Seiten  automatisch aufruft (und dadurch eine ID erzeugen läßt), um dann dieses Bild mit der ID herunterzuladen. Ich denke, ich bräuchte eine konzentrierte Stunde und eine Regular-Expressions Doku.

    Um das zu verhindern, kannst du das aufrufen der ursprünglichen HTML-Seite an einen Mensch-Test koppeln. Denkbar ist da z.B. das Abtippen eines als Bild dagestellten zufälligen Textes.

    Dann kann man wirklich nur noch mit sehr viel Aufwand die Bilder automatisch kopieren (Schrifterkennungssoftware gibt es aber auch...), einem Menschen, der das Bild ja schließlich sehen _soll_ kannst du aber niemals verbieten, das Bild herunterzuladen (und wenn es den Monitor mit einer Digitalkamera abphotographieren muß).

    Ist das jetzt mit Kanonen auf Spatzen geschossen?

    Grüße

    Heizer

    1. hallo Heizer,

      Eine alternative Lösung mit PHP:

      PHP ist keine "Alternative" zu .htaccess.

      Du kannst das Verzeichnis, in dem die Bilder liegen, mit .htaccess komplett für den HTTP-Zugriff sperren

      Korrekt, das geht. Aber dann kann auch niemand das HTML-Dokument aufrufen, das in diesem Verzeichnis liegt, und das Margrith offensichtlich _nicht_ sperren möchte.

      (wie hab ich vergessen, aber es geht).

      Wie das geht, steht natürlich in inzwischen sicher mehrhundertfacher Darstellung im Forumsarchiv.

      Dann legts du in einem anderen Verzeichnis eine PHP-Datei an, die über das _Dateisystem_ auf das Verzeichnis zugreift, das Bild holt und ausgibt (Content-type beachten!!).

      Ups? Kannst du bitte erklären, elche Vergewaltigung du hier vorhast? Ein Verzeichnis ist entweder (für die Auslieferung bestimmter Dateitypen) gesperrt oder es ist frei. Was du hier andeutest, ist zwar prinzipiell möglich. Aber ein einigermaßen kompetenter Provider wird einen solchen "Umweg" niht zulassen, da das ja dem Willen der "Sperrung" absolut zuwiderläuft.

      Allerdings ist es nicht weiter schwierig, ein Script zu schreiben, daß HTTP-Seiten  automatisch aufruft (und dadurch eine ID erzeugen läßt)

      Gibt es irgendeinen Nachweis für diese zukunftsweisende Programmieridee?

      Ist das jetzt mit Kanonen auf Spatzen geschossen?

      Nein, das ist "ein Brotkrümelchen einem Pottwal zur Fütterung anbieten"

      Grüße aus Berlin

      Christoph S.

      1. hallo Heizer,

        Eine alternative Lösung mit PHP:

        PHP ist keine "Alternative" zu .htaccess.

        richtig! wichtig?
        Wo steht bitte, daß PHP eine Alternative zu .htaccess ist? Eine Lösung die einen anderen Weg als den zuerst vorgeschalgenen beschreitet, ist mit Fug und Recht als alternativ zu bezeichnen.

        Du kannst das Verzeichnis, in dem die Bilder liegen, mit .htaccess komplett für den HTTP-Zugriff sperren

        Korrekt, das geht. Aber dann kann auch niemand das HTML-Dokument aufrufen, das in diesem Verzeichnis liegt, und das Margrith offensichtlich _nicht_ sperren möchte.

        Es ist wohl durchaus im Bereich den Möglichen anzusiedeln, diese Datei (bzw. die Bilder) in einem anderen Verzeichnis abzulegen.

        Dann legts du in einem anderen Verzeichnis eine PHP-Datei an, die über das _Dateisystem_ auf das Verzeichnis zugreift, das Bild holt und ausgibt (Content-type beachten!!).

        Ups? Kannst du bitte erklären, elche Vergewaltigung du hier vorhast?

        Das ist nicht nurmöglich, sondern ganz normal. .htaccess sperrt nur den Zugriff des httpd. Das Dateisystem verfügt unter UNIX über eigene Rechte, die ich natürlich nicht sperre, und auch nicht sperren muß.

        Auf ein fopen() von PHP folgt ein Dateisystemzugriff mit den Rechten des httpd (sumindest als Standard), und die Dateirechte der Bilder werden in der Regel auf 644 stehen, so daß er das Bild in jedem Fall lesen kann.

        Im gegensatz zu deiner Behauptung würde ich sagen, daß das gerade bei kompetenten Providern möglich sein sollte.

        Allerdings ist es nicht weiter schwierig, ein Script zu schreiben, daß HTTP-Seiten  automatisch aufruft (und dadurch eine ID erzeugen läßt)

        Gibt es irgendeinen Nachweis für diese zukunftsweisende Programmieridee?

        Ich weiß nicht, was daran Zukunftsweisend sein soll?

        • mit fopen() öffne ich eine beliebige Seite im Internet.
        • Mit Regulären ausdrücken suche ich mir alle src=("|'|)(.*)("|'|) heraus.
        • Diese Bilder lade und speichere ich.

        Der Unterschied zu einer normal verlinkten Version ist hier nur, daß ich jedes Mal, wenn ich ein Bild abfragen möchte, zuerst die HTML-Seite aufrufen muß, um gültige ID's zu bekommen.

        Es ist also unwahrscheinlich, daß eine andere Seite die eigenen Bilder direkt einbinden und so Traffic auf dem eigenen Server erzeugen würde. Das ist durchaus eine Überlegung wert, wenn man damit Probleme hat. Zusammen mit dem Mensch-Test ist das wohl niemandem den Aufwand wert, das zu knacken.

        Meine Grüße

        Heizer

        1. Hallo du da draußen,

          Der Unterschied zu einer normal verlinkten Version ist hier nur, daß ich jedes Mal, wenn ich ein Bild abfragen möchte, zuerst die HTML-Seite aufrufen muß, um gültige ID's zu bekommen.

          Es ist also unwahrscheinlich, daß eine andere Seite die eigenen Bilder direkt einbinden und so Traffic auf dem eigenen Server erzeugen würde. Das ist durchaus eine Überlegung wert, wenn man damit Probleme hat. Zusammen mit dem Mensch-Test ist das wohl niemandem den Aufwand wert, das zu knacken.

          Moment. Soweit ich Margrith verstanden habe, will sie, dass niemand das Bild klaut. Und nicht, dass niemand das Bild bei sich einbindet. Wöllte ich ihr Bild klauen, würde ich nun bei deinem Schutz trotzdem mit Rechts auf das Bild klicken, und »Bild speichern unter« wählen. In wie fern ist also deine Lösung eine Erschwerung für den Bilderklau?

          Grüße von hier drinnen, aus Biberach an der Riss,
          Candid Dauth (Dogfish)

          --
          »Bismarck biss Mark, bis Mark Bismarck biss!«
          http://cdauth.net.tc/
          ie:{ fl:( br: va:} ls:[ fo:| rl:( n4:( ss:) de:> js:( ch:| sh:( mo:) zu:|
          1. Hallo du da draußen,

            Soweit ich Margrith verstanden habe, will sie, dass niemand das Bild klaut. Und nicht, dass niemand das Bild bei sich einbindet.

            Anscheinend will sie das doch. :-( Zumindest, wenn man zwischen den Zeilen liest.
            Ich sollte wohl doch besser ins Bett gehen. Hab letzte Nacht nicht geschlafen... ;-)

            Grüße von hier drinnen, aus Biberach an der Riss,
            Candid Dauth (Dogfish)

            --
            »Bismarck biss Mark, bis Mark Bismarck biss!«
            http://cdauth.net.tc/
            ie:{ fl:( br: va:} ls:[ fo:| rl:( n4:( ss:) de:> js:( ch:| sh:( mo:) zu:|
  4. N'Abend allerseits

    Gleichfalls!

    In einem Verzeichnis (z.B Fotos) liegt eine HTML-Datei, welche
    die Bilder anzeigt, die im gleichen Verzeichnis liegen.

    Meine Frage: Kann ich via .htaccess bestimmen, dass nur diese
    eine HTML-Datei Zugriff auf diese Bilder hat?

    Lass mich vorweg schon einmal eins raten: Diese HTML-Datei heißt zufällig index.html (o.Ä.) und verhindert auf diese Weise, dass sich jemand ein Verzeichnislisting von /fotos/ (per Browser) besorgen kann.
    Ich kenne mich mit .htaccess in dieser Hinsicht nicht aus, aber - sofern die Browser deiner Besucher "richtig" arbeiten, erhält der Apache zu jeden angefordertem Bild (aus diesem Verzeichnis) den Referer index.html, d.h. dass die index.html auf die Bilder verweist. Folglich musst du dem Server (oder einer serverseitigen Technik) beibringen, die Bilder nur dann auszuliefern, wenn der Referer stimmt. In PHP kannst du das mit $_SERVER['HTTP_REFERER_] abfragen, in Perl über $ENV{'HTTP_REFERER'} oder mit Hilfe des CGI-Moduls.

    Ich will damit verhindern, dass jemand diese Seite nachbaut und so die Bilder bei sich einbauen kann.
    Ok, mir ist natürlich bewusst, dass man die Bilder auch so kopieren, abspeichern und in seine Seite einbauen kann! Ich will aber das "Automatisieren" unterbinden können.

    Das wird dir nicht gelingen. Falls tatsächlich jemand die Bilder auf jeden Fall haben will, wird er sich im zweifelsfalle nicht davon abhalten lassen, seinem Script mitzuteilen, es möge den entsprechenden Referer senden. Meine Lösung stellt lediglich eine höhere Hürde dar. Wenn du 100%ig verhindern willst, dass jemand unberechtigt diese Bilder sieht, hänge sie in ein Museum/Galerie und verlange Eintritt.

    Bisher habe ich unter den .htaccess-Anleitungen keinen Lösungsansatz gefunden. Darum wende ich mich an Euch und danke schon jetzt für jeden Hinweis!

    Ich hoffe, geholfen zu haben

    Schöner Abend noch
    Margrith

    Gleichfalls, Robert

  5. http://trafficklau.de/

    ;-)

    gruss Stefan

  6. In einem Verzeichnis (z.B Fotos) liegt eine HTML-Datei, welche
    die Bilder anzeigt, die im gleichen Verzeichnis liegen.

    Meine Frage: Kann ich via .htaccess bestimmen, dass nur diese
    eine HTML-Datei Zugriff auf diese Bilder hat?

    alle versuche, dieses auf webserverebene zu machen werden scheitern, da der webserver letzlich nichts weiter als ein fileserver ist. irgendwann macht der browser ja den bildrequest.

    Ich will damit verhindern, dass jemand diese Seite nachbaut und so die Bilder bei sich einbauen kann.
    Ok, mir ist natürlich bewusst, dass man die Bilder auch so kopieren, abspeichern und in seine Seite einbauen kann! Ich will aber das "Automatisieren" unterbinden können.

    genau. die bilder sollen ja auch mal auf dem browser angezeigt werden.

    Bisher habe ich unter den .htaccess-Anleitungen keinen Lösungsansatz gefunden. Darum wende ich mich an Euch und danke schon jetzt für jeden Hinweis!

    die einzige möglichkeit ist, die bilder nur über einen programmaufruf(script) auszuliefern.
    dazu sollten die bilder mit einer filextension, welche keinen application-type hinterlegt hat, gespeichert sein.
    der aufruf erfolgt dann über das script, mit parm=bild. das script lädt die datei und liefert sie aus, mit application-type = bild.

    zusätzlich kann im script geprüft werden, ob dies der erstkontakt ist, und dann keine bilder ausliefern. erst bei folgekontakten werden bilder geliefert. so kann ein robot, welcher normalerweise ja für einen request keinen folgekontakt aufbaut nix sinnvolles bekommen.