Bilder nur für eingeloggte User

Ein scheinbar schon oft besprochenes Thema, jedoch möchte ich an dieser Stelle es noch mal aufgreifen, da ich selber sowas realisieren möchte.

Es geht also um Folgendes:

Ich möchte verhindern, dass ein Bild images/hamster.jpg (z.B. von meinem Hamster unter der Dusche, der was dagegen hätte, wenn ihn die Hamster aus der Nachbarschaft so sehen könnten) NUR von auf meiner Seite angemeldeten Usern aufgerufen werden kann bzw. nur von meinen Seiten in HTML eingebunden werden kann.

Setze ich eine .htaccess so kann ich ja zwar PHP-Dateien includieren, mit Bildern funktioniert das aber leider nicht.

Meine bis jetzt favorisierte Lösung für dieses Problem:

-Bilder in einen Ordner save_images legen und .htaccess setzen (somit sicher)
-Ordner images bekommt nur eine PHP-Datei (bilderload.php), die eine Datei aus dem Ordner save_images laden kann und per Header zurück geben kann. Dies geschieht aber nur, wenn die Session die Legetimation hat
-404er des Ordners images auf bilderload.php setzen

Rufe ich nun z.B. die Grafik images/hamster.jpg per HTML auf, so wird per 404er die datei images/bilderload.php aufgerufen die da sagt: hey, der ist ja registriert, ich lade das bild aus dem save_images-Ordner und gebe es per Header zurück.

Das ganze funktioniert auch schon, aber dies für alle Projekt vorzunehmen wird nervig und ich habe die Hoffnung, dass dies auch noch schicker / einfacher geht.

Mit .htaccess kenne ich mich leider nicht so doll aus :frowning:

Ich würde auch gerne mal, die endgültige Lösung in eine Form pressen, die für andere als Beispielsscript downloadbar wäre.

Uff, ist ja doch ganz schön viel Text geworden.

Freue mich schon auf Antwort und danke Euch jetzt schon mal.

Lg Schumi

ganz einfach: setz’ ganz normal links auf die bilder (also den image-tag).

dann fabrizier’ eine session, die du zur identifikation nuten kannst, z.b.

[php]

<?php $_SESSION['logged'] = true; ?>

[/php]

wenn der user eingeloggt ist, soll PHP den link ziegen, ansonsten nicht.

in code ausgedrückt, sollte das so aussehen:

[php]

<?php if($_SESSION['logged'] == true) { echo ''; } else { echo 'zum ansehen einloggen'; } ?>

[/php]

eine ausführliche beschreibung zu sessions und login gibts von mir im tutorial-bereich.

hoffe mal, ich konnte dir helfen.

Nils aka XraYSoLo

naja, wirklich sicher ist das nicht ^^

ansonsten musst du die file in den htdoc ordner streamen

na dann versuch’ mal von außen eine session zu erstellen…

Nils aka XraYSoLo

ja, nur ist der direktzugriff auf die file möglich, oder man generiert das bild on the fly, bei filmen, downloads oder etc. gehts aber nicht so einfach.

link verschlüsseln und per MIME-type aufrufen…

Nils aka XraYSoLo

nene, das wäre ne nette lösung aber ich will die schon richtig sicher machen.

sowas würde sich ja z.B. auch anbieten, PDFs die man verkaufen möchte anzubieten.

In meinem Fall wäre es sensible kundendateien, die wirklich nur von diesem kunden gedownloadet werden dürfen.

ich sehe schon, an meiner lösung komme ich wohl im mom nicht vorbei :frowning:

Eine Alternative gäbe es, aber die klappt nicht bei jedem (so wie bei mir und ich habe keine ahnung warum):

Bilder einfach oberhalb des rootverzeichnisses (z.B. html) ablegen:
htdocs/webbox5/html/index.html
htdocs/webbox5/images/index.html

Wo sind die Cracks die sowas wissen:shock:

also daten abzuschotten ist generell viel einfacher und sicherer als dateien zu schützen.
in dem falf mit den kundendaten kannste ruhig meine lösung nehmen, die ist bei korrekter programmierung nicht knackbar.

Nils aka XraYSoLo

hmmm, teste das gerne mal durch. kannst du mir mal nen codeschnipsel geben?

derweil habe ich meine lösung auch fertig. musste nur php opendir neu setzen…

ich bin in sachen sciherheit ein perfektionist, bei mir liegen wichtige daten nie in ordnern die apache verwaltet (htdocs), ausser natürlich ich will diese ohne einschränkungen verteilen. die frage ist immer wieviel sicherheit man braucht, ob die datei oder der pfad geschützt werden soll u.s.w. :mrgreen:

ich sprach ja auch vom ablegen in einer datenbank :-P.

Nils aka XraYSoLo

naja, datenbank kann mit der größe probleme geben, aber ist schon nen guter anfang :slight_smile:

Wieso nutzt du nicht eine get-Variable, die auf das Bild verweist?
bilderupload.php?image=hamster.jpg zeigt dann dein Hamsterbild an. Verlinken kannst du dann ja direkt auf die oben genannte Datei mit get-Variable. Dann bräuchtest du keine 404er.

das hab’ ich doch gesagt ^^.

→ der ordner bleibt unbekannt und es wird nur der dateiname genannt (oder ein zugewiesener hash-wert, den sich keine sau merken kann :-P).

Nils aka XraYSoLo

Man könnte es auch mit htaccess schützen, es geht (wie schon beschrieben) schöner…

Sonst frag doch mal in der Jobbörse nach.

@Freak Überschätzt du dich da nicht ein bisschen? xD

Die beste Lösung wäre, das man ein anderes Skript includiert das den Bildaufruf erledigt.
Mal nen Beispiel:
[php]
require_once(„bildaufruf.php“);

if(isset($_SESSION[‚S‘]) && $_SESSION[‚S‘] = „wert“)
{
echo bildaufruf(„hamsterlein.jpg“);
}
else
{
echo „einloggen bitte…“;
}
bildaufruf
function bildaufruf($pic)
{
$str = „<img src’“.$pic.„'>“;
return $str;
}
[/php]

Aber ob das hilft weiss ich jetzt nicht, man könnte ja es per Datenbank script rausholen…

das bringt doch nichts, dein script gibt nur zurück, was dann ja doch wieder im Quelltext steht…

Wenn dann musst du die Datei gleich als Bild ausgeben lassen
imageloader.php
[PHP]

<?php session_start(); $bild = "hashdir/4564sd85r6346564/"; if ($_SESSION["login"]) { // <= Benutzer ist eingeloggt $ext = array_pop(explode($raw,".")); $bild .= md5($_GET["bild"]).".".$ext; } else { //benutzer ist nicht eingeloggt (standardbild) $ext = "jpg"; $bild .= md5("keinBild").".".$ext; } $ext = ($ext == "jpg") ? "jpeg" : strtolower($ext); header("Content-Type: image/".$ext); $img = "imagecreatefrom".$ext($bild); "image".$ext(); ?>

[/PHP]
das ruft das bild auf und zeigt es an, dazu wird das bild aus einem nicht öffentlichen Ordner geholt „hashdir/4564sd85r6346564/“ sowie der Bildname verschlüsselt.

Ein Bildaufruf wie folgt

<img src="imageloader.php?bild=smile.jpg" />

Zeigt also in wirklichkeit das Bild
hashdir/4564sd85r6346564/100469ba358dc13266535d06ca357164.jpg an und prüft auch gleichzeitig ob du eingeloggt bist und leitet dem enstprechend ein anderes Bild weiter.

Frank das ist ebenfalls sehr leicht umgehbar, man gibt in der url einfach
imageloader.php?bild=smile.jpg an, und schon sieht man das Bild.

ne deshalb ist ja die weiche dadrin

[PHP]<?php session_start(); $bild = "hashdir/4564sd85r6346564/"; if ($_SESSION["login"]) { // <= Benutzer ist eingeloggt $ext = array_pop(explode($raw,".")); $bild .= md5($_GET["bild"]).".".$ext; } else { //benutzer ist nicht eingeloggt (standardbild) $ext = "jpg"; $bild .= md5("keinBild").".".$ext; } ?>[/PHP]

Wenn du eingeloggt bist darfst das bild ja eh sehen, und wenn nicht wird nur „keinBild.jpg“ ausgegeben

So, ich habe es jetzt mit einer bilder.php gelöst, welche NICHT als 404er sondern über den IMG-Tag aufgerufen wird. Die 404er Lösung funzt jedoch trotzdem und bietet sich evtl. für einen weichen Wechsel an.

Das ganze ist getestet und funktioniert jetzt auch soweit. :roll:

In der bilder.php prüfe ich, ob das Bild angezeigt werden darf mittels Session.

Damit das Bild nicht von unbefugten aufgerufen werden kann, liegt das Bild in einem Order der oberhalb des Webroots liegt und somit nicht per ULR aufrufbar ist.

Um überhaupt mit PHP auf einen Ordner ausserhalb des Roots zugreifen zu können, musste ich jedoch im Confix meines Webspaces
„open basedir“ auf „NONE“ setzen. Wer dies nicht kann, muss ggf. mit einem per .htaccess geschützten verzeichnis innerhalb
des Roots arbeiten.

Schauts Euch bitte mal an und sagt mir, ob das alles so sinn macht!?

LG Schumi

Dateistruktur:
bilder_save/
-hamster.jpg
-blind.jpg

web/ (Root des Webs)
index.php
bilder.php

// Inhalt der index.php
[HTML][/HTML]

//Inhalt der bilder.php
[PHP]
if($_SESSION[‚login‘])
{
$dateiname=$_GET[‚bild‘];
//Wenn mann eine 404er Seite daraus machen will
//$dateiname= basename($_SERVER[„REQUEST_URI“]);
}
else
$dateiname=„blind.jpg“;

$fp = fopen(„…/bilder_save/$dateiname“, „r“);
if ($fp) {
//$dateityp =substr(„$dateiname“, -3);
//header(„Content-type: image/$dateityp“);
header(„Expires: 0“);
fpassthru($fp);
fclose($fp);
}
[/PHP]