Geschützte Downloadbereiche (upload/myFolder) wie Categorie?

Martuno
Beiträge: 15
Registriert: Di 20. Dez 2005, 13:45
Wohnort: Zürich
Kontaktdaten:

Geschützte Downloadbereiche (upload/myFolder) wie Categorie?

Beitrag von Martuno » Di 20. Dez 2005, 14:09

Hallo

mit Freude habe ich festgestellt, dass im neuen Contenido 4.6.2 geschützte Kategorien verfügbar sind.

Nun möchte ich in einer solchen geschützten Seite auch File-Downloads anbieten. Nun habe ich das Problem, dass ein solcher Download (z. B. upload/MyFolder/MyFile.pdf) allen als hidden link offen steht.

Nun sehe ich folgende Möglichkeiten (mit Vor-/Nachteilen):

a) als hidden link belassen und hoffen niemand weiss es

b) upload/MyFolder mit .htaccess zu schützen, der Benutzer muss sich dann aber 2x einloggen.

c) dbfs verwenden. Hier kann ich aber nicht zwischen den einzelnen Forntend-Benutzergruppen unterscheiden. Btw: der link wird im TinyMCE nicht auf dbfs.php?file=upload/MyFolder/MyFile.pdf gesetzt, sondern upload/dbfs:/MyFolder/MyFile.pdf

d) Ein weiterer Workaround wäre hierzu einen eigenen Mandanten anzulegen, welcher mit .htaccess geschützt ist, aber das ist unschön! Unter 4.4.4 ging es aber auch nicht anders.


Wie geht ihr mit diesem Problem um?
Am liebsten wäre mir c) mit feingranularen privileges.
Any other ideas?!? Comments?!? Auf 4.7 warten? :-)


Gruss
Martin

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Di 20. Dez 2005, 15:17

ok wir haben das problem folgendermaßen gelöst:

eine .htaccess reingelegt und geschützt.

den link statt regulär mit "upload/datei.pdf" anzusteuern durch die front content gejagt - also so: front_content.php?idartlang=23&file=upload/datei.pdf

der artikel selbst liegt über contenido geschützt und beinhaltet nur ein modul (nix anderes, also kein html oder leerzeichengedöns) und liest mit readfile() die datei ein. so ist sichergestellt dass nur die usergruppen zugriff zum artikel idartlang erhalten die über die frontenduserrechte zugang erhalten dürfen.

nachteil dieser version: der download auf diese art klappt perfekt, wenn man die datei allerdings im programm öffnet (also öffnen beim speichern unter dialog bei den pdfs wählt) dann wird nix angezeigt, da das programm (hier acrobat) keine rechte hat diesen artikel anzuzeigen. wir haben es mit einem hinweis über dem download gelöst, der die besucher auffordert die datei zwischenzuspeichern.

Martuno
Beiträge: 15
Registriert: Di 20. Dez 2005, 13:45
Wohnort: Zürich
Kontaktdaten:

Beitrag von Martuno » Di 20. Dez 2005, 16:26

Hallo Stese,

das schein mir eine sehr elegante Lösung zu sein! Wenn ich das richtig verstehe, können so die normalen Contenido-Rechte verwendet werden und das ganze ist erst noch Release-fähig.


Darf ich nochmals rekapitulieren?

1) ich mache Layout mit nur CMS_CONTENT[1] bzw. dem neuen <container>...</container>

2) Das Modul enthält in etwa: <?php readfile($file); ?>
(du hast nicht grad den src zur Hand?)


Frage:
- wie geht ihr mit den Header und v.a. MIME-Settings um?
- aus security-Gründen erlaubt das Modul wahrscheinlich nur downloads aus /upload/...
- anything else to think of?


Gruss
Martin


PS: Unter folgener URL hats eine ganze Reihe von Bsp. der Header settings.
http://php.benscom.com/manual/en/function.readfile.php

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Di 20. Dez 2005, 16:59

korrekt - im layout ist ein einziger container dem folgendes modul zugewiesen wird:

Code: Alles auswählen

<?php
  // hier pfad zum upload folder angeben, damit url kurz gehalten wird 
  // z.b. front_content.php?idartlang=23&filepath=filename.pdf
  // sucht die datei in upload/securefiles/filename.pdf
  $upload_path = 'upload/securefiles/';

  $arr_path_parts = array();
  
  // wurde eine seite übergeben?
  if ( isset($_GET["filepath"]) && !empty($_GET["filepath"]) ) {
    
    $str_filepath = $upload_path . $_GET["filepath"];
    
    $arr_path_parts = pathinfo($_GET["filepath"]);
    
    $str_file = $arr_path_parts['basename'];
       
    $size = filesize($str_filepath);

    // erzinge das speichern unter fenster
    header('Content-type: application/force-download');

    // benne downloadnamen
    header('Content-Disposition: attachment; filename="' . $str_file . '"');
    
	header("Content-Transfer-Encoding: binary");
    header("Content-Length: " . $size);    
    
	// lese datei ein ...
    readfile($str_filepath);
    
  }

?>
es wird der header vom type application/force-download genommen, damit auch browser übergreifend das speichern unter fenster kommt - wenn man den korrekten header der applikation nimmt, versucht der browser ja die datei in der applikation zu laden, was nicht funktionieren wird (wegen der fehlenden rechte der applikation in contenido)

security geschichten habe ich derzeit nicht eingebaut, (also das entfernen von ../ - das kannst du ja manuell noch reinschreiben)
ich habe dieses modul in einer erweiterten variante im einsatz, die mir jeden download als logfile mit eingeloggtem benutzer und pfad etc in ein datenbank logfile schreibt, so kann ich später rekapitulieren, wer was runtergeladen hat (oder auch wer scheisse angestellt hat ;))

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Mi 21. Dez 2005, 22:38

Das ist eine sehr schöne Lösung, da man damit vermutlich auch unterschiedliche Gruppen unterschiedlich berechtigen kann.

Alternativ besteht die Möglichkeit, das DBFS-System zu nutzen und Dateien daraus nur angemeldeten (aber dann allen) Usern zugänglich zu machen (da gibt es einen Haken in den Eigenschaften der Datei in der Dateiverwaltung). Der Verweis zum Erhalt der Datei geht dann auf <Mandanten-Verzeichnis>/dbfs.php?file=<Dateiname>

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

Knigge
Beiträge: 8
Registriert: Sa 4. Mär 2006, 17:51
Wohnort: Münsterland
Kontaktdaten:

geschützes Verzeichnis und Download-Liste

Beitrag von Knigge » Mo 3. Apr 2006, 19:32

Hallo Stese,

auch ich möchte pdf-Daten im geschützten Bereich als Download zur Verfügung stellen. Ich nutze dort das Modul Download-Liste von dir. Kann man dies mit der eleganten Lösung von oben kombinieren? Wenn ja, wie?
Ist es egal, was in der .htaccess steht? Ich kann Verzeichnisse über ein Webinterface meines Anbieters schützen, so dass ich die .htaccess garnicht zu sehen bekomme.

Viele Grüße
Knigge

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Mo 3. Apr 2006, 23:05

hallo,

das gleiche dürfte mit der download liste von mir funktionieren - den artikel, der die downloads praktisch ausführt einfach in eine geschützte kategorie legen - dann kommt vor dem eigentlichen laden der datei die passwort abfrage - so zumindestens theoretisch ... getestet habe ich es jetzt nicht.

das verzeichnis kannst du mit irgend einer .htaccess datei schützen - theoretisch brauchst du dann nicht mal ein valides passwort - aber achtung: wenn du in dieses verzeichnis was hochladen willst, kann es passieren dass die pw abfrage kommt - so ganz genau kann ich dir das momentan nicht sagen

Knigge
Beiträge: 8
Registriert: Sa 4. Mär 2006, 17:51
Wohnort: Münsterland
Kontaktdaten:

Beitrag von Knigge » Di 4. Apr 2006, 17:50

Danke für die schnelle Antwort.

Es läuft bestens.

Gruß
Knigge

xsankax

Beitrag von xsankax » Do 21. Sep 2006, 15:35

Also irgendwie funktioniert das bei mir nicht so wie es soll.
Habe einen Artikel mit dem neuen Layout, welches nur das gepostete Modul enthält, angelegt.
Wenn ich dann einen Link setze wie beschrieben, erhalte ich folgende Fehlermeldung:
Warning: Cannot modify header information - headers already sent by (output started at /mnt/kw2/05/913/00000007/htdocs/v30/cms/front_content.php(792) : eval()'d code:9) in /mnt/kw2/05/913/00000007/htdocs/v30/cms/front_content.php(792) : eval()'d code on line 30

Warning: Cannot modify header information - headers already sent by (output started at /mnt/kw2/05/913/00000007/htdocs/v30/cms/front_content.php(792) : eval()'d code:9) in /mnt/kw2/05/913/00000007/htdocs/v30/cms/front_content.php(792) : eval()'d code on line 33

Warning: Cannot modify header information - headers already sent by (output started at /mnt/kw2/05/913/00000007/htdocs/v30/cms/front_content.php(792) : eval()'d code:9) in /mnt/kw2/05/913/00000007/htdocs/v30/cms/front_content.php(792) : eval()'d code on line 35

Warning: Cannot modify header information - headers already sent by (output started at /mnt/kw2/05/913/00000007/htdocs/v30/cms/front_content.php(792) : eval()'d code:9) in /mnt/kw2/05/913/00000007/htdocs/v30/cms/front_content.php(792) : eval()'d code on line 36
Im Anschluß an die Meldung wird die Seite mit Sonderzeichen vollgeschrieben. Dies ist PDF Datei, wie wenn sie mit dem Editor von Windows geöffnet wird.

Was mach ich da falsch, wieso wird die Datei nicht gespeichert bzw. geöffnet?

Noch ne zweite Frage:
Muss der Link (z.B. front_content.php?idartlang=23&filepath=filename.pdf) eigentlich die idartlang haben, oder kann ich es auch mit der idart machen?

Gruß
Christian

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Di 26. Sep 2006, 13:37

Aktiviere das Debugging (siehe contenido/config.misc.php) und suche die Stelle mit der Fehlermeldung.

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

xsankax

Beitrag von xsankax » Di 26. Sep 2006, 14:28

Habe ich gemacht und das ist der Code der in den Zeilen steht:
Zeile 28: // erzinge das speichern unter fenster
Zeile 29: header('Content-type: application/force-download');
Zeile 30:
Zeile 31: // benne downloadnamen
Zeile 32: header('Content-Disposition: attachment; filename="' . $str_file . '"');
Zeile 33:
Zeile 34: header("Content-Transfer-Encoding: binary");
Zeile 35: header("Content-Length: " . $size);
Zeile 36:
Zeile 37: // lese datei ein ...
Zeile 38: readfile($str_filepath);
Das ist 1 zu 1 der Code von oben, ohne eine Änderung.

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Di 26. Sep 2006, 14:56

ja weil dort der header versucht wird zu setzen.

ich schätze du hast den thread auch korrekt durchgelesen? vor allem diesen teil:
der artikel selbst liegt über contenido geschützt und beinhaltet nur ein modul (nix anderes, also kein html oder leerzeichengedöns) und liest mit readfile() die datei ein. so ist sichergestellt dass nur die usergruppen zugriff zum artikel idartlang erhalten die über die frontenduserrechte zugang erhalten dürfen.
also NICHTS, wirklich gar nichts darf in deinem layout vor dem modul stehen

xsankax

Beitrag von xsankax » Di 26. Sep 2006, 15:21

Alles klar. Daran lag es.
Hatte versehentlich einen Tag drinnen, obwohl ich diesen Thread eigentlich gelesen hatte. Bin aber auf diese Idee überhaupt nicht gekommen, dass es an dem liegen kann.

Danke für die schnelle Hilfe

Christian

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

Beitrag von derSteffen » Do 11. Okt 2007, 13:48

Hallo,

es ist mir ja fast peinlich, aber ich habe diesen Artikel jetzt bestimmt 7 mal gelesen und mir stellen sich immer mehr Fragen, vielleicht könnt Ihr mir helfen.

1. Was muss denn in die htaccess rein? Nur eine leere .htaccess hat ja keinen Effekt.

Muss ich denn noch eine .htusers oder .htgroups, bzw. ein .htpasswd anlegen? Es soll das Verzeichnis upload/intern gesichert werden!

2. Das gepostete Modul kommt doch dann in mein Intern-Download-Template, oder? Also muss es doch, oder!

Ich habe ein Layout blanko angelegt mit dem Inhalt CMS_CONTAINER[1], dann habe ich das oben genannte Modul angelegt. Und dieses Modul habe ich in mein Intern-Download-Template eingefügt, ganz am Anfang (natürlich ist in diesem Template auch meine Navi, das Downloadmodul von stese etc. drin) aber warum musste ich denn ein leeres Layout anlegen? Hierzu gibt es ja gar kein Bezug mehr. Also denke ich irgendwo einen Fehler gemacht zu haben.

Sorry fürs Nachfragen.

Ach übrigens soll das in einer 4.6.15 MR laufen!

Danke schon mal

Steffen

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

Beitrag von tinof » Fr 12. Okt 2007, 08:00

Hi,

schau' mal hier: http://www.contenido.org/forum/viewtopic.php?t=17769

Ich mache da was ganz ähnliches, da ist das mit der .htaccess und dem Layout erklärt.

.htgroups usw. braucht es nicht, weil die dort beschriebene .htaccess JEDEN Zugriff 'von aussen' unterbindet.

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

Gesperrt