Bild per Header übergeben/ausliefern Bild per Header übergeben/ausliefern
 

News:

CPG Release 1.6.26
Correct PHP8.2 issues with user and language managers.
Additional fixes for PHP 8.2
Correct PHP8 error with SMF 2.0 bridge.
Correct IPTC supplimental category parsing.
Download and info HERE

Main Menu

Bild per Header übergeben/ausliefern

Started by blue23, March 07, 2008, 03:10:49 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

blue23

Im Moment versuche ich jetzt grad den Ordner in dem die Bilder drinnen sind (../galerie/albums/images/..) per htaccess zu schützen und so nur die Bilder anzeigen zu lassen, wenn man in Coppermine das entsprechende Bild aufruft aber nicht wenn man die direkte URL des Bildes kennt.

Nun habe ich folgendes probiert:
Ich habe folgenden .htaccess code in das image-Verzeichnis gelegt:


# .htaccess-Datei für images-Verzeichnis
AuthType Basic
AuthName "Protected"
AuthUserFile .htuser
Require user  User1


Dazu wäre es nun ja nötig, dass man sich über den Verzeichnisschutz anmeldet um direkt darauf zuzugreifen. Aber nun werden die Besucher ja auch aufgefordert sich dafür einzuloggen.
Nun habe ich gelesen, dass man dies jedoch per ausliefern des Bildes via Header "umgehen" kann, da das Bild direkt per PHP aufgerufen wird.
Allerdings habe ich so etwas nur am Beispiel eines bestimmten Bildes gefunden, daher wollte ich fragen, wie das dynamisch in Coppermine funktioniert und was man dafür wo editieren muss.(Leider bin ich noch kein Pro was PHP angeht ;))


Gruß blue

Timos-Welt

#1
Grundsätzlich geht sowas mit einer php-Datei, die du aufrufst. Zum Beispiel:

<?php
header
('Content-type: image/jpeg'); 
readfile("bild.jpg")?>


Der Aufruf dieser PHP-Datei im Browser würde einfach nur bild.jpg anzeigen als hättest du es direkt aufgerufen.

Um die Fullsize-Pics nicht mehr direkt sondern über eine solche php-Datei aufzurufen, wäre wie folgt vorzugehen:

1. Lege eine Datei namens showthepic.php im Hauptverzeichnis von Coppermine an mit dem folgenden Inhalt:
<?php
$mypath 
$_GET['mypath'];
// Wenn einer versucht, ins übergeordnete Verzeichnis zu wechseln, beenden
if($mypath!=str_replace("..","",$mypath)) die;
// Wenn einer versucht, eine php-Datei im Quellcode auszulesen, beenden
if($mypath!=str_replace("php","",$mypath)) die;
// Wenn einer versucht, eine .htaccess-Datei im Quellcode auszulesen, beenden
if($mypath!=str_replace("htaccess","",$mypath)) die;
// Wenn Datei nicht existiert, beenden
if(file_exists('./albums/'.$mypath)!=True) die;
// Dateiendung ermitteln und in Kleinbuchstaben umwandeln
$ft=substr($mypath, -4);
$ft=strtolower($ft);
// Wenn Datei nicht vom Typ jpg, jpeg, png, gif oder png, beenden
if(($ft!='.jpg')&&($ft!='jpeg')&&($ft!='.gif')&&($ft!='.png')) die;
header('Content-type: image/jpeg'); 
readfile ('./albums/'.$mypath);
?>


2. Prüfe, ob es in der theme.php des von dir benutzten Themes eine Funktions namens function theme_display_fullsize_pic() gibt.
3. Falls nicht, öffne die theme.php aus dem Sample-Theme und kopieren die komplette Funktion in dein eigenes theme hinüber. Achtung: Die Funktion hat ziemlich viel plain HTML am Ende und endet auf
<?php
}


4. Ändere die Zeile
$pic_url = get_pic_url($row, 'fullsize');
in
$pic_url = 'showthepic.php?mypath='.$row['filepath'].$row['filename'];

Fertig.

Diese Lösung hat aber Nachteile:
- Sie belastet den Server stärker, die Performance wird also schlechter.
- Sie funktioniert nur, wenn PHP entsprechend konfiguriert ist, damit sie funktionieren kann.
- Sie funktioniert so nur mit diesem einen Theme. Um's generell zu ändern, müsstest du die themes.inc.php abändern, wovon hier im Forum zu Recht abgeraten wird.
- Sie stellt ein Sicherheitsrisiko dar, da du Dateien von der Platte des Servers liest und publizierst.

Was du in deine .htaccess-Dateien reinschreibst, ist dem PHP-Skript aber schnurzegal, da es die Datei auf File-Ebene und nicht auf Webserverebene aufruft. Also wäre damit ein Kennwortschutz möglich.

Die Lösung verhindert nun aber natürlich nicht, dass jemand auf die PHP-Datei Hotlinks setzt; da müsstest du dich noch um eine Session-Manegement kümmern und in die Sache einbauen.

Mehr im folgenden Posting.

Edit: Einige Sicherheitsfunktionen nachgetragen.

Timos-Welt

#2
Wenn du selbiges dann noch ebenso für die Bilder in Zwischengröße haben willst:
- Prüfe ob deine theme.php die funktion theme_html_picture() bereits enthält.
- Falls nicht: Die komplette Funktion aus der theme.php des Sample-Theme in die theme.php deines Themes kopieren.
- Die Zeile
$pic_html .= "<img src=\"" . $picture_url . "\" class=\"image\" border=\"0\" alt=\"{$lang_display_image_php['view_fs']}\" /><br />";
austauschen gegen
$pic_html .="<img src=\"showthepic.php?mypath=" . $CURRENT_PIC_DATA['filepath']."normal_".$CURRENT_PIC_DATA['filename']. "\" class=\"image\" border=\"0\" alt=\"{$lang_display_image_php['view_fs']}\" /><br />";

Jetzt hast du aber immer noch das Problem, dass die Thumbnails ebenso im selben Verzeichnis liegen...