dateien aus geschützten verzeichnissen mit php anzeigen
Andreas
- programmiertechnik
Hallo,
dieses Forum ist meine letzte Rettung. Ich suche schon seit sechs Stunden in allen möglichen Tutorials, Handbüchern und Postings nach einer Lösung. Vielleicht gibt es ja garkeine, aber das kann ich irgendwie nicht glauben.
Zunächst die Anforderungen an die Lösung, sozusagen als Leitplanke:
1. Auf dem Server befindet sich ein Verzeichnis mit Unterverzeichnissen. Auf die Dateien in diesen Verzeichnissen dürfen nur User zugreifen, die über PHP eingeloggt sind und auf die Dateien über ein bestimmtes Script zugreifen.
2. Direkter Zugriff auf die Dateien bei Kenntnis ihres Pfads soll ausgeschlossen sein (-> htaccess).
3. In den htaccess-geschützten Verzeichnissen befinden sich Thumbnails von Grafiken, die eingeloggten Usern in einer Auswahlmaske angezeigt werden sollen. Der HTML-Code dieser Maske wird durch ein PHP-Script generiert.
4. Die Thumbnails werden von PHP aufgesammelt und in den HTML-Code entsprechend integriert (<img src...> ?)
5. Die Dateien können nicht auf Verzeichnisse oberhalb des Document-Roots, also ausserhalb des Webservers, gelegt werden
6. Auch sollen die Dateien NICHT in ein temporäres Verzeichnis kopiert werden
Untaugliche Lösungsversuche:
1. Logischerweise kann über <img src...> nicht auf die Bilder zugegriffen werden, sie sind ja per htaccess geschützt
2. Der Schutz kann umgangen werden, wenn das Skript direkt auf einzelne Dateien zugreift (es sind nicht nur Bilder). Dazu müssen aber die header-Informationen übersandt, also jeweils neue Seiten geöffnet werden, z.B. durch eine entsprechende Pop-Up-Funktion mit Javascript zusammen mit PHP. Das taugt aber hier nicht, sollen doch in der Auswahlmaske mehrere Thumbnails gleichzeitig angezeigt werden, zudem wurden die header-Informationen beim Aufbau dieser Seite ja bereits geschickt
Konkrete Fragen:
Mit mod_rewrite in htaccess könnte vielleicht eingestellt werden, dass der Zugriff auf die Verzeichnisse möglich ist, wenn diese von dem Skript zur Ausgabe der Thumbnails ausgehen.
* Wie könnte das in der .htaccess aussehen?
* Wie werden dann die Bilder im Skript angesprochen (<img src...>?)
Nehmen wir an, die Bilder liegen in Verzeichnis /test/test/ und das Ausgabeskript ist /test/ausgabe.php.
Vielleicht müsste in .htaccess erst eine Check-Routine aufgerufen werden, in der überprüft wird, ob es sich bei dem referer um ausgabe.php handelt z.B.:
<file: /test/test/.htaccess>
RewriteEngine On
Options FollowSymLinks
RewriteRule (.*) /pfad-zur-check-routine
</file>
Nur wie kriege ich die Bilder angezeigt, wenn der Check erfolgreich war.
Wenn ich dich richtig verstanden habe, dann liegt hier ein Denkfehler vor:
Dazu müssen aber die header-Informationen übersandt, also jeweils neue Seiten geöffnet werden, z.B. durch eine entsprechende Pop-Up-Funktion mit Javascript zusammen mit PHP. Das taugt aber hier nicht, sollen doch in der Auswahlmaske mehrere Thumbnails gleichzeitig angezeigt werden, zudem wurden die header-Informationen beim Aufbau dieser Seite ja bereits geschickt
Natürlich kannst Du auf einer Seite nur einmal Header verschicken. Die müssen ja auch gesendet werden, bevor der HTML-Code kommt.
Aber trotzdem kannst Du mehrere Bilder auf einer Seite mit PHP generieren. Hier sendest Du ja nicht mehr die Header deiner Seite.
Du machst dir ein Script bild.php, welches als Parameter z.B. ?img=irgendwas.jpg o.ä. erwartet.
Dieses Script wird per Imagetage eingebunden, z.B. so: <img src="bild.php?img=3" />
Und dann erzeugt dieses Script den Header
header( "Content-type: image/jpg" ); und dann reichst Du das Bild an den Browser weiter.
Es funktioniert also problemlos, daß du mehrere Bilder so auf einer Seite anzeigen läßt.
Gruß, rob
Prima, das schien mir jetzt auch eine gute Idee zu sein. Leider funktioniert es nicht, egal ob mit oder ohne htaccess-Schutz. Siehe hierzu den Thread, den ich gerade an passenderer Stelle geschrieben habe:
http://forum.de.selfhtml.org/?t=91314&m=549135
Hast Du ein Beispiel, wo das wirklich läuft?
So, mit Hilfe aus dem Forum hier funktioniert das jetzt doch - nur leider umgeht das NICHT den htaccess-Schutz, mein Problem bleibt also bestehen.
Soweit aber, falls das mal jemand anderes hier interessiert, hier der Code:
<?php
// Variable holen
$_GET["file"];
$_GET["path"];
$pathfile = $path."/".$file;
// Welcher Typ?
if (substr($file,-4) == ".gif") {$type = "gif";}
if (substr($file,-4) == ".jpg" or substr($file,-5) == ".jpeg") {$type = "jpeg";}
// Header senden
header('Location: '.$pathfile.'');
header("Content-type: image/$type");
header("Content-Disposition: attachment; filename=$file");
header("Content-Length: " . filesize(getcwd() . "$pathfile"));
readfile(getcwd() . "$pathfile");
?>
hi,
So, mit Hilfe aus dem Forum hier funktioniert das jetzt doch - nur leider umgeht das NICHT den htaccess-Schutz, mein Problem bleibt also bestehen.
https://forum.selfhtml.org/?t=91314&m=549168
und bitte gewöhne dir ab, dein problem an zwei stellen parallel zu diskutieren, das verwirrt nur (dich und andere).
gruß,
wahsaga
und bitte gewöhne dir ab, dein problem an zwei stellen parallel zu diskutieren, das verwirrt nur (dich und andere).
Du hast recht. Dann poste ich jetzt dazu nur noch hier. Danke.
hi,
Du hast recht. Dann poste ich jetzt dazu nur noch hier. Danke.
OK, dann zeig doch bitte noch mal den code, den du bis jetzt hast, wenn es damit noch nicht funktionieren sollte.
gruß,
wahsaga
OK, dann zeig doch bitte noch mal den code, den du bis jetzt hast, wenn es damit noch nicht funktionieren sollte.
Nein, funktioniert leider nicht und ich bin immer noch am herumdoktern. Ich habe auch so meine Zweifel, ob der Weg über den img-Tag der richtige ist. Wie dem auch sei, hier nochmal der Code:
<?php
// Variable holen
$_GET["file"];
$_GET["path"];
$pathfile = $path."/".$file;
// Welcher Typ?
if (substr($file,-4) == ".gif") {$type = "gif";}
if (substr($file,-4) == ".jpg" or substr($file,-5) == ".jpeg") {$type = "jpeg";}
// Header senden
header("Content-type: image/$type");
header("Content-Disposition: attachment; filename=$file");
header("Content-Length: " . filesize(getcwd() . "$pathfile"));
readfile(getcwd() . "$pathfile");
?>
Aufgerufen wird das dann im img-Tag: <img src="test.php?file=test.jpg&path=test">
Das Attribut zu Content-Disposition (attachment) scheint mir falsch zu sein. Leider habe ich bezüglich header-Funktionen null Erfahrung. Bin schon am Suchen.
Danke, dass Du am Ball bleibst.
hi,
Das Attribut zu Content-Disposition (attachment) scheint mir falsch zu sein.
header("Content-Disposition: attachment; filename=$file");
ja, der muss weg, weil wie gesagt extra dafür da, den "speichern"-dialog auszulösen.
gruß,
wahsaga
Es ist geschafft!! Hier der funktionierende Code, htaccess bleibt aussen vor!:
<?php
// Variable holen
$_GET["file"];
$_GET["path"];
$pathfile = $path."/".$file;
// Welcher Typ?
if (substr($file,-4) == ".gif") {$type = "gif";}
if (substr($file,-4) == ".jpg" or substr($file,-5) == ".jpeg") {$type = "jpeg";}
// Header senden
header("Content-type: image/$type");
header("Content-Disposition: attachment; filename="$file"");
@readfile($pathfile);
?>
Es ist geschafft!! Hier der funktionierende Code, htaccess bleibt aussen vor!:
Zu früh gefreut. Das Ganze hat keine Cross-Browser-Funktionalität. Es funzt nur im IE, nicht bei NS...