Modul: Download aus geschützten Verzeichnissen

tinof
Beiträge: 197
Registriert: Mi 24. Jan 2007, 20:38
Wohnort: Kirchberg / Sa.
Kontaktdaten:

Modul: Download aus geschützten Verzeichnissen

Beitrag von tinof » Mi 1. Aug 2007, 08:11

Hallo,

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>
Beim Speichern kommen Warnungen, dass <head> und <body> - tags fehlen, diese ignorieren wir.

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>
Eine solche Datei schützt implizit auch alle Unterordner, ggf. reicht also eine Datei im 'Download - Root'

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);
?>
-> da ich Zugriff auf die $sess und $auth - Variablen benötige, muss die Seite innerhalb von Contenido generiert werden. Deshalb der
'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.
Zuletzt geändert von tinof am Do 12. Nov 2009, 06:45, insgesamt 3-mal geändert.
Für die Freizeit : www.hobbybrauer.de

gepo
Beiträge: 203
Registriert: Fr 13. Mai 2005, 16:25
Wohnort: Ruhrpott
Kontaktdaten:

Beitrag von gepo » Fr 3. Aug 2007, 05:52

hallo tinof,
vielen Dank für deine Mühe.

gepo
Beiträge: 203
Registriert: Fr 13. Mai 2005, 16:25
Wohnort: Ruhrpott
Kontaktdaten:

Beitrag von gepo » Fr 3. Aug 2007, 07:31

Hallo tinof,
habe gerade mal getestet und alles so gemacht wie in deiner Anleitung.
Nur das ich die .htaccess - Datei nicht per ftp sondern per
CONTENT
DATEIVERWALTUNG
in das entsprechende Verzeichnis upgeloadet habe.

Ich erhalte die Fehlermeldung:
Die Webseite wurde nicht gefunden.

Hast du eine Idee voran das liegen könnte?

bfn
gepo

tinof
Beiträge: 197
Registriert: Mi 24. Jan 2007, 20:38
Wohnort: Kirchberg / Sa.
Kontaktdaten:

Beitrag von tinof » Fr 3. Aug 2007, 08:04

Wann erscheint diese Meldung ? Beim Klick auf eine Datei zwecks Download ?

Welche URL wird da aufgerufen ? Stimmt hier der Contenidopfad ? GGf. bitte mal die URL der Downloadseite (Liste der Downloads) und eine der Download-URLs für ein File posten .

cu
Tino
Für die Freizeit : www.hobbybrauer.de

gepo
Beiträge: 203
Registriert: Fr 13. Mai 2005, 16:25
Wohnort: Ruhrpott
Kontaktdaten:

Beitrag von gepo » Fr 3. Aug 2007, 11:30

tinof hat geschrieben:Wann erscheint diese Meldung ?
Die Meldung erscheint wenn ich eingeloggt bin und auf den Navigationslink klicke, der jetzt sichtbar ist.

Siehe hier:
www.abenteuer-bergbau.de

hier dann unter
Kunst und Kohle
login mit kunde
pw kunde

tinof
Beiträge: 197
Registriert: Mi 24. Jan 2007, 20:38
Wohnort: Kirchberg / Sa.
Kontaktdaten:

Beitrag von tinof » Fr 3. Aug 2007, 12:02

Erstmal : Tolle Seite !!!!
Schöne Bilder, viele Infos, interessante Details.

Der Bergbau ist zwar bei uns leider schon einige Jahre vorbei aber die Tradition lebt hier noch in den Menschen !
Deshalb spricht mich das besonders an.

Zum Problem:
Da bereits beim Aufruf der Downloadliste der Fehler kommt, prüfe bitte folgendes :

In dem Template, auf dem die Artikel in "Vertraulich.." basieren, muß das Modul "Download geschuetzt" zugeordnet sein (und nur dieses - nicht das Download Action - Modul!). Bitte nochmal prüfen und auch prüfen, ob die Artikel das richtige Template haben.

Das Modul "Download Action" muss in einem anderen (neu anzulegendem) Template, zusammen mit dem Layout "leere Seite" zugeordnet werden. Auf Basis dieses zweiten Templates wird ein neuer Artikel erstellt, der nicht im geschützten Bereich liegen sollte. Z.B. bei Systemseiten, dort wo auch die Fehlerseiten liegen.

Falls das noch nichts bringt, versuche bitte mal zunächst ohne die .htaccess - Datei - es sollte auf jeden Fall auch mit ungeschützten Verzeichnissen gehen.

Wenn es dann immer noch Probleme gibt, schick' mir mal per PM einen Backend - Zugang; ich würde mir das 'vor Ort' mal anschauen. Da ich das Modul erst in einer Präsenz im Einsatz habe, kann ich in anderen Installationen / Umgebungen Seiteneffekte nicht ausschließen.

Ach ja, welche PHP - Version ist auf dem Server ?

Viel Erfolg und

Glück Auf aus dem Erzgebirge !

Tino
Für die Freizeit : www.hobbybrauer.de

gepo
Beiträge: 203
Registriert: Fr 13. Mai 2005, 16:25
Wohnort: Ruhrpott
Kontaktdaten:

Beitrag von gepo » Fr 3. Aug 2007, 12:41

tinof hat geschrieben:Erstmal : Tolle Seite !!!!
Schöne Bilder, viele Infos, interessante Details. Der Bergbau ist zwar bei uns leider schon einige Jahre vorbei aber die Tradition lebt hier noch in den Menschen ! Deshalb spricht mich das besonders an.
Danke, Danke... Das der Bergbau hier in NRW bis 2018 auslaufen soll, macht mich ganz krank
In dem Template, auf dem die Artikel in "Vertraulich.." basieren, muß das Modul "Download geschuetzt" zugeordnet sein (und nur dieses - nicht das Download Action - Modul!). Bitte nochmal prüfen und auch prüfen, ob die Artikel das richtige Template haben.
Unter Pkt.3 in deinem Tutorial hattest du geschrieben "Import des Download - Action- Moduls". (Vielleicht noch mal genauer beschreiben)
Habe jetzt die Zuordnung geändert und ich komme jetzt aber bis zum
download-small.html
Leider klappt der download nicht mit der rechten Maustaste. Es wird immer eine front_content.html zum download bereitgestellt, nicht die Datei selber...
Probiere es selber aus..Zugang ist noch aktiv...

gepo
Beiträge: 203
Registriert: Fr 13. Mai 2005, 16:25
Wohnort: Ruhrpott
Kontaktdaten:

Beitrag von gepo » Fr 3. Aug 2007, 12:52

tinof hat geschrieben: Ach ja, welche PHP - Version ist auf dem Server ?
Glück Auf aus dem Erzgebirge !
Tino
Server Betriebssystem Apache
MySQL Serverversion 4.1.22-max-log
Installierte PHP-Version 4.4.4

:D Glück auch auf

tinof
Beiträge: 197
Registriert: Mi 24. Jan 2007, 20:38
Wohnort: Kirchberg / Sa.
Kontaktdaten:

Beitrag von tinof » Fr 3. Aug 2007, 12:57

Dumme Frage :
Der Artikel mit dem Download - Action - Modul ist auch online geschaltet und hat die idcatart 166 ?
Für die Freizeit : www.hobbybrauer.de

gepo
Beiträge: 203
Registriert: Fr 13. Mai 2005, 16:25
Wohnort: Ruhrpott
Kontaktdaten:

Beitrag von gepo » Di 7. Aug 2007, 06:35

tinof hat geschrieben:Dumme Frage :
Der Artikel mit dem Download - Action - Modul ist auch online geschaltet und hat die idcatart 166 ?
..Ja
..aber der Download klappt jetzt auch wenn ich nicht angemeldet bin..

tinof
Beiträge: 197
Registriert: Mi 24. Jan 2007, 20:38
Wohnort: Kirchberg / Sa.
Kontaktdaten:

Beitrag von tinof » Di 7. Aug 2007, 07:44

Hallo,

also im moment steht da ja ein Direktlink auf die Datei, das "Download - Geschützt" - Modul scheint überhaupt nicht mehr aktiv zu sein.

Der Download ohne Anmeldung klappt auf diese Weise immer - deshalb habe ich ja das Modul angepasst.

Wenn man jetzt den Ordner \upload\pdf\ per .htaccess - Datei schützt, ist der Zugriff wieder gesperrt, es geht aber auch der Zugriff als angemeldeter Benutzer nicht mehr auf diese Weise.

P.S.
Danke für die Hinweise zur Installationsanleitung, ich habe das oben versucht zu verbessern.

Das Angebot, direkt 'mal reinzuschauen steht noch - pm genügt.

Grüße
Tino
Für die Freizeit : www.hobbybrauer.de

gepo
Beiträge: 203
Registriert: Fr 13. Mai 2005, 16:25
Wohnort: Ruhrpott
Kontaktdaten:

Beitrag von gepo » Di 7. Aug 2007, 08:46

tinof hat geschrieben: Das Angebot, direkt 'mal reinzuschauen steht noch - pm genügt.
Habe dir doch eine pm geschickt...

derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Beitrag von derSteffen » Fr 12. Okt 2007, 17:33

Also ich muss sagen das Modul funktioniert sehr gut. Ich habe es unter 4.6.15 MR mit aktiviertem MR getestet. Jetzt bleibt mir nur noch eine unverschämte Frage - könnte man diese Geschichte auch mit dem Downloadmodul von stese http://www.contenido.org/forum/viewtopi ... nloadliste umsetzen? Bzw. welche Anpassungen hast du bei dem Downloadmodul von Dinkel vorgenommen?

Danke

Steffen

tinof
Beiträge: 197
Registriert: Mi 24. Jan 2007, 20:38
Wohnort: Kirchberg / Sa.
Kontaktdaten:

Beitrag von tinof » Sa 13. Okt 2007, 11:36

Ok, nun hab' ich das Modulvon stese doch kurz überflogen,
und würde auf den ersten Blick sagen:

Einfach das Downloadverzeichnis per .htaccess schützen und in dem Modul Download File die Prüfung der Autorisierung (Anmeldung) ergänzen (gleich nach den cInclude() - Zeilen):

Code: Alles auswählen

// Berechtigung pruefen
if ( !isset($auth) || !is_numeric($auth->auth["uid"]) ) {
	header("HTTP/1.0 404 Not Found");
	die ("Zugriff verweigert !");
} 
Grübel Grübel, warum habe ich mir damals eigentlich die Arbeit für ein eignes Modul gemacht ??? Das stese - Teil ist doch genial.

Grüße
Tino
Für die Freizeit : www.hobbybrauer.de

delinquent
Beiträge: 184
Registriert: Fr 17. Aug 2007, 12:15
Kontaktdaten:

Beitrag von delinquent » Sa 13. Okt 2007, 18:35

Gute Idee dieses Modul. Ich würde allerdings den 404 Header durch

Code: Alles auswählen

header("HTTP/1.0 403 Forbidden");
ersetzen.

Ich denke das trifft auf Deinen Anwendungsfall besser zu :-)

Gesperrt