PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Images vor Zugriff schützen via PHP?



Biko
15-01-2003, 10:49
Hallo zusammen,

ich habe eine Website mit Login für Mitglieder. Login funktioniert über PHP, Abfrage der Userdaten in Mysql und Übergabe an Session.

Jetzt habe ich aber das Problem, dass Bilder nur geschützt sind, wenn sie in einer PHP Seite liegen. Kennt jemand den Pfad des Bildes & er gibt ihn als URL ein, so wird das Bild ohen Passwortschutz angezeigt.

Wie kann ich einen Schutz auch für Bilder erreichen? Habe an .htaccess gedacht, aber ich möchte nicht alle Userdaten in .htaccess speichern, da es mehrere 100 sind.
Könnt Ihr mir helfen?


Vielen Dank schon mal,

Biko

The Unknown
15-01-2003, 11:31
Setz die Bilder in ein verzeichnis ausserhalb des web-roots, und kopier sie nur bei Bedarf in einen Pfad der öffentlich zugänglich ist.

Biko
15-01-2003, 11:38
Hi,

danke für die Antwort, aber ich habe die Lösung schon selber gefungen.
Mit folgendem Skript kann ich das Bild zum Download anbieten, ohne dass der Browser das Bild anzeigen muss. Da kann jetzt einfach eine Loginabfrage rein & fertig ist das geschützte Bild:

//// Login Abfrage//////


//// Wenn Login ok/////

$name = "/pfad/zum/bild.jpg"
$filepath = urldecode($name);
$filename = "bild.jpg";

if(strIstr(getenv(HTTP_USER_AGENT), "MSIE"))
{
header("Content-disposition: filename=$filename");
header("Content-type: application/x-ms-download");
}
else
{
header("Content-disposition: attachment;filename=$filename");
header("Content-type: application/octet-stream");
}
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-cache");
header("Cache-Control: post-check=0, pre-check=0");
header("Pragma: no-cache");
header("Content-length: ".filesize("$filepath"));
readfile("$filepath");



Ciao,
Biko

The Unknown
15-01-2003, 11:44
Biko:
so kann man ebenso an den Pfad der Datei kommen, der ja immer gültigkeit hat, und dort das Bild direkt runterladen. (abgesehen das der IE 5.5 teils Buggy ist bei deiner Lösung und das Bild trotzdem anzeigen würde)

Eine 'nach ausserhalb des webroots'-Aktion wäre imho besser (falls es dir auf die sicherheit ankommen würde), wenn du nicht mit .htaccess arbeiten möchtest. Du könntest diese andere möglichkeit auch mit dem Download kombinieren.

Gaert
15-01-2003, 12:16
Warum machst du´s nicht einfach so:



<?php
//Hier kommt erst dein Passwort kram!
header("Content-type: image/jpeg");
$pfadname=/pics/; //Pfad ausserhalb des Document Roots
$file = $pfadname . $_REQUEST['image'] . ".jpg"; //Image wird übergeben
$fh = fopen($file,"r");
echo fread($fh,filesize($file));
fclose($fh);
?>


Das "Datei bei Bedarf kopieren" verbraucht nur unnötig Performance!

The Unknown
15-01-2003, 13:31
Gaert:

prinzipiell gebe ich dir Recht,
aber es käme drauf an ob man dem User einmalig drauf Zugriff geben möchte oder mglw. auch öfter in einer bestimmten Zeit, je nach den Anforderungen an das Skript.

Gaert
15-01-2003, 16:32
@The Unknown

Ich sehe das Problem eher darin, dass damit ein echter "Schutz" für das Bild nicht gewährleistet ist. Das Temporäre Bild bleibt solange über eine URL auch ohne Passwortschutz erreichbar, bis es irgendwann gelöscht wird.
Die einzig Sinnvolle Möglichkeit ein Bild vor ungewolltem download zu "schützen", die mir einfällt, ist wirklich das Bild direkt über ein Skript auszugeben. Zusätzlich entsteht, wie schon erwähnt, noch der overhead, dass das Bild bei jedem Aufruf kopiert werden muss (und eventuell alte Bilder gelöscht).
Performance technisch ist kein Unterschied zwischen einem "Skript Bild" und einem Bild, dass direkt über den Browser addressiert werden kann... zumal das Bild nach dem ersten aufruf eh gecached wird (auch das "Skript Bild").
Es ist meiner Meinung nach also völlig egal ob auf das Bild nun einmalig oder öfter darauf zugegriffen wird.

The Unknown
15-01-2003, 17:09
Dieses Script-Bild mag auch im Browser gecached werden, die Operation des Auslesens auf dem Server wird aber bei jedem Aufruf erneut gemacht.
Das finde ich nicht besonders Serverschonend programmiert ;) Mein Gedankenweg, falls das zu schützende Bild mglw. öfters aufgerufen werden sollte bspw bei einer Webseite, das diese Datei aus dem besagtem Verzeichnis rauskopiert wird mit einem Unique-Dateinamen für den User und seine aktuell laufende Session. Nach ca. 5 minuten mit keinen neuanforderungen des Users kann das temp. Bild wieder gelöscht werden.

hmm .. ich würde meinen das die von mir Vorgeschlagene Methode performanter sein könnte, aber habe jetzt nicht die Muße das zu benchmarken ;)

Biko
15-01-2003, 18:50
... vielen Dank für die Antworten.
Bei meinem Skript habe ich jetzt natürlich die Verzeichnisse mit htaccess geschützt, in denen die Bilder liegen. Dann kann niemand mehr ran. Aber ein Pfad ausserhalb der Document roots geht natürlich auch.

Gaert: Deine Methode klappt auch prima.

Jetzt hat sich mein Problem aber noch verschärft. Es sollen auch die Thumbnails, die in der Übersichtsseite sind, in einem gschützten Bereich liegen, so dass nur eingeloggte user diese sehen können.
Kann ich auch Bilder, die ausserhalb der documten roots liegen in meinen HTML Code ausgeben, oder so? Macht es Sinn, die Thumbnails bei Bedarf zu kopieren, sie anzuzeigen und sie dann wieder zu löschen? Mir scheint das viel Last auf dem Server zu erzeugen?

Ciao,
Biko