grundsätzlich basierend auf dem Up-Downloadmodul von Dinkel, habe ich ein Modul entwickelt, das den Download von Dateien aus geschützten Verzeichnissen heraus ermöglicht.
Bei ungeschützten Verzeichnissen besteht das Problem, dass man bei Kenntnis des Dateinames / Verzeichnisses auf alle Dateien zugreifen kann, indem man den Namen als URL eingibt.
Die vorliegende Version erlaubt darüber hinaus den Download nur, wenn ein Frontenduser korrekt angemeldet ist. Das ist in meiner konkreten Anwendung so, kann aber auch anders gelöst werden.
Das Modul besteht aus
- einem Modul zur Auswahl und Verwaltung der Downloads (+ 2 Templates)
- einem Modul für den eigentlichen Download
- einem leeren Layout für die Downloadseite
Zunächst alle Quellen herunterladen!
Installation:
1. Import des Moduls "Download_geschuetzt". Dieses Modul kann in beliebige Templates eingebunden werden (wie ein HTML - Text o.ä.). Dann Erstellen eines/mehrerer Artikel im geschützten Bereich basierend auf diesem Template und Konfiguration des Moduls (selbsterklärend; die Frontenduser und der geschützter Bereich sollten bereits angelegt sein).
2. Anlegen eines spartanischen Layouts (siehe auch Beispiel in den Quellen):
Code: Alles auswählen
<container id="10" name="blank">blank</container>
3. Import des Moduls "Download_Action". Erstellen eines neuen Templates aus dem Layout (2.) mit diesem Modul.
4. Anlegen eines Artikels auf Basis des Templates (3.). Dieser Artikel muss in einem Bereich stehen, der nicht über die Navigationen
zugänglich ist, er wird nie direkt (über Menüs) aufgerufen.
Der Artikel sollte auch nicht im geschützten Bereich stehen (selbst wenn man ihn so direkt von überall per idcatart aufrufen kann - macht nichts).
Ich habe ihn unter <Systemseiten>. Online - Schalten nicht vergessen. Nach dem Speichern die idcatart des Artikels (siehe "Eigenschaften") lesen und merken
5. Administration->Mandanten->[Mandant]->Mandanteneinstellungen : Einen Eintrag anlegen:
Typ: "download"
Name:"idcatart"
Wert:[idcatart aus (4.)]
6. die Templates (siehe Download) nach /cms/templates kopieren.
7. den / die Download - Ordner mit folgender .htaccess - Datei schützen:
Code: Alles auswählen
<Files *.*>
order allow,deny
deny from all
</Files>
fertig.
Da ich Contenido - Neuling bin, möchte ich hier das Konzept noch zur Diskussion stellen:
Der eigentliche Download erfolgt nicht per Link auf die Datei sondern über folgenden Code (Modul Download -Action):
Code: Alles auswählen
<?php
// Berechtigung pruefen
if ( !isset($auth) || !is_numeric($auth->auth["uid"]) ) {
header("HTTP/1.0 404 Not Found");
die ("Zugriff verweigert !");
}
// Uebergabevariablen pruefen
if (!$sess->is_registered("down_files")) {
header("HTTP/1.0 404 Not Found");
die ("Unberechtigter Aufruf !");
}
// in $_GET["file"] steht der Index der Datei in der globalen $down_files
$file = $down_files[$_GET["file"]];
if ($file == "") {
header("HTTP/1.0 404 Not Found");
die ("Ungueltiger Aufruf !");
}
// Damit die Browser wissen was los ist:
$filename = basename($file);
$size = filesize($file);
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=\"$filename\"");
header("Content-Length: $size");
// Und Download ! :
readfile($file);
?>
'Kunstgriff' mit dem leeren Layout. Eine reine php - Seite erfordert immer die Übergabe von Parametern mit der URL ($_GET[]) und wäre dadurch leichter angreifbar. Außerdem ist es mir nicht gelungen, globale Variablen aus einem Contenido - Modul in eine unabhängige php - Seite zu übergeben ($sess->register() geht nur in Contenido, session_register() bringt "headers already sent" - Fehler).
-> die Dateinamen werden vom Download - Verwaltungsmodul im Array $down_files[] gespeichert, die Download - Seite erhält nur den Index
innerhalb des Arrays. Damit werden die eigentlichen Dateipfade zusätzlich verschleiert. Mir hat auch hier eine Variante per $_GET - Übergabe nicht gefallen, weil dann Dateinamen sichtbar sind. Bei großen Dateilisten sicherlich nicht der optimale Weg, in meiner Anwendung geht es aber im 10-20 Dateien.
-> den eigentlichen HTML - Code habe ich aus einem php - Forum, er klappt bei mir mit IE7, Opera und Firefox.
Das Ganze ist ziemlich speziell, aber ich denke, das Grundprinzip ist erkennbar und kann relativ leicht in andere Anwendungen übernommen werden.