Ergebnis 1 bis 15 von 15

Thema: Dateien im Frontend herunterladbar machen, trotz Backendschutz?

  1. #1
    Contao-Nutzer
    Registriert seit
    27.05.2014.
    Beiträge
    121

    Frage Dateien im Frontend herunterladbar machen, trotz Backendschutz?

    Hallo Community,

    ich stehe vor folgendem Problem:
    Ich möchte einen geschützten Bereich für Mitglieder haben, in dem jeder Dateien hochladen darf in sein eigenes Home-Verzeichnis. Funktioniert auch prima mit dem bestehenden Formulargenerator. Registrierung und Login schützen auch diese Seiten. Ebenfalls prima. Nach dem Login soll jeder seine eigenen Dateien anschauen und herunterladen können. Grob sieht das ungefähr so aus:



    Das Skript dazu:

    PHP-Code:
    $FrontendUserObject FrontendUser::getInstance();  

                    
    // Member has home folder  
                    
    if ( $FrontendUserObject->assignDir == '1') {  
                        
    $homeFolderObj FilesModel::findByPk($FrontendUserObject->homeDir);
                        
    $pathToHomeFolder $homeFolderObj->path;
                    
    // Edit
                        
    $files array_diff(scandir($pathToHomeFolder), array('.''..'));

                        echo 
    'Hochgeladene Dateien:<br/>';
                        foreach (
    $files as $file) {
                            
    $filepath $pathToHomeFolder '/' $file;
                            echo 
    '<a href="' $filepath '" target="_blank">' $file '</a><br/>';
                            echo 
    '<a href="' $filepath '" target="_blank">' 'Ansehen ' '</a>';
                            echo 
    '<a href="' $filepath '" download>' 'Herunterladen ' '</a>';
                            echo 
    '<a class="delete" href="' $pathToHomeFolder '/' $file '" target="_blank">' ' Löschen' '</a><br/><br/>';
                        }
                    } 
    Aber folgender Haken bei der Sache:
    Es sind teilweise sensible Dateien hochgeladen, die unbedingt geschützt werden müssen. Das heißt, mit dem direkten Link auf z.B. eine Bilddatei im Home-Verzeichnis kann aber jeder darauf zugreifen. Schütze ich diesen Ordner im Backend in der Dateiverwaltung, funktioniert aber mein Skript nicht mehr.

    Code:
    Warning: scandir(files/kunden/beispielkunde): failed to open dir: No such file or directory in /var/www/vhosts/xxx/httpdocs/xxx/templates/xxx/homedir.php on line 11
    
    Warning: scandir(): (errno 2): No such file or directory in /var/www/vhosts/xxx/httpdocs/xxx/templates/xxx/homedir.php on line 11
    
    Warning: array_diff(): Argument #1 is not an array in /var/www/vhosts/xxx/httpdocs/xxx/templates/xxx/homedir.php on line 11
    Hochgeladene Dateien:
    
    Warning: Invalid argument supplied for foreach() in /var/www/vhosts/xxx/httpdocs/xxx/templates/xxx/homedir.php on line 15
    Entweder muss ich also mein Skript umschreiben, sodass geschützte Ordner trotzdem angezeigt werden können- oder ich muss die Dateien anders schützen. Wichtig ist nur, dass man sich per Nutzername und Passwort, welches von Contao zugewiesen wurde, authentifizieren muss. (Logischerweise alles möglichst automatisch, damit die Pflege möglichst leicht bleibt)

    MfG,
    Deniz

    Contao 4.4.8
    PHP 7.0.26

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Sieh dir das Download(s) Inhaltselement an. Du musst quasi dasselbe machen. Also nicht direkt auf die Datei verlinken, sondern auf die aktuelle URL mit einem GET Parameter, sodass das Script dann die Datei zum Benutzer schickt. Das Script kann dann auch noch zusätzlich überprüfen, ob der gerade eingeloggte Benutzer auch tatsächlich auf die Datei zugreifen darf.

  3. #3
    Contao-Nutzer
    Registriert seit
    27.05.2014.
    Beiträge
    121

    Standard

    Habe ich gerade. So könnte ich auch einen entsprechenden Link generieren lassen ABER- das ändert ja leider nicht die Tatsache, dass mein Skript den Ordnerinhalt nicht mehr auslesen kann. Ich komme leider nicht darauf, wie ich das auslesen lassen soll? Sobald die Ordner geschützt sind, streiken meine Zeilen 7-9

  4. #4
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.943

    Standard

    Die Verzeichnisse im Backend zu schützen ist m.E. der richtige Weg. Damit die Dateien auch heruntergeladen werden können musst Du das Download oder das Downloads Content Element verwenden. Das kannst Du auch in Deinem Skript erzeugen. Dort musst Du via ContentModel die Parameter setzen, die Du bei Konfiguration im Backend setzen würdest. Vielleicht hilft Dir dieser Thread weiter, bei dem es zwar um eine Gallery geht, aber im Prinzip das gleiche sein sollte: https://community.contao.org/de/show...l=1#post457432

    Edit: viel zu langsam
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  5. #5
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.943

    Standard

    Zitat Zitat von d33eniz Beitrag anzeigen
    Sobald die Ordner geschützt sind, streiken meine Zeilen 7-9
    Oben sind keine Zeilennummern angegeben, aber wenn Du die <a href="..."> meinst: genau das muss bei geschützten Verzeichnissen durch das Downloads Element gemacht werden.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  6. #6
    Contao-Nutzer
    Registriert seit
    27.05.2014.
    Beiträge
    121

    Standard

    Damit meinte ich

    PHP-Code:
    if ( $FrontendUserObject->assignDir == '1') {   
                        
    $homeFolderObj FilesModel::findByPk($FrontendUserObject->homeDir); 
                        
    $pathToHomeFolder $homeFolderObj->path
    Weil mir dann bereits mitgeteilt wird, dass der Frontend Nutzer kein HomeDir habe, was ja nicht stimmt. Ich schaue mir mal den anderen Thread an und berichte. Danke schonmal!

  7. #7
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Zitat Zitat von d33eniz Beitrag anzeigen
    Habe ich gerade. So könnte ich auch einen entsprechenden Link generieren lassen ABER- das ändert ja leider nicht die Tatsache, dass mein Skript den Ordnerinhalt nicht mehr auslesen kann. Ich komme leider nicht darauf, wie ich das auslesen lassen soll? Sobald die Ordner geschützt sind, streiken meine Zeilen 7-9
    Dein Script sollte auf jeden Fall Zugriff auf die Dateien haben. Was mir auffällt ist, dass du nicht mit absoluten Pfaden arbeitest. Du solltest mit TL_ROOT arbeiten.

  8. #8
    Contao-Nutzer
    Registriert seit
    27.05.2014.
    Beiträge
    121

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Dein Script sollte auf jeden Fall Zugriff auf die Dateien haben. Was mir auffällt ist, dass du nicht mit absoluten Pfaden arbeitest. Du solltest mit TL_ROOT arbeiten.
    Plump ausgedrückt "bisher hat es doch funktioniert?" Wie würde ich sonst arbeiten? Bzw. wie würde das konkret aussehen?

  9. #9
    Contao-Nutzer
    Registriert seit
    27.05.2014.
    Beiträge
    121

    Standard

    Update:

    Code sieht momentan so aus:
    PHP-Code:
    $FrontendUserObject FrontendUser::getInstance();

                    
    // HomeDir check
                    
    if ( $FrontendUserObject->assignDir == '1') {  
                        
    $homeFolderObj FilesModel::findByPk($FrontendUserObject->homeDir);
                        
    $pathToHomeFolder $homeFolderObj->path;
                    
    // Edit Deniz
                        
                        
    $doc_root $_SERVER["DOCUMENT_ROOT"];
                        
    $contao_root $doc_root.'/../';
                        
    $fullpath $contao_root.$pathToHomeFolder;
                        
    $files array_diff(scandir($fullpath), array('.''..'));
                        
    $website_root 'https://' $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
                        
                        foreach (
    $files as $file) {
                            
    $filepath $pathToHomeFolder '/' $file;
                            
    $download_link $website_root '?file=' $filepath;
                            echo 
    '<a href="' $download_link '">' $file ' herunterladen ' '</a><br/><br/>';
                        }
                    }
                    else
                        echo 
    "no home folder"
    So, alle Pfade sind nun richtig, die Dateien werden mir auch korrekt angezeigt und korrekt heruntergeladen- aber nur, wenn ein Download(s)-Modul aktiv auf derselben Seite auf denselben Ordner zeigt. Ich habe mir das Template zum Modul angesehen und keinen einzigen Hinweis darauf bekommen können, was das Downloads-Modul anders macht. Ich habe mir gedacht "okay, vielleicht müssen unbedingt die gleichen HTML-Konstrukte verwendet werden", aber das spielt auch keine Rolle. Was macht das Downloads-Modul noch, was bei mir fehlt? Wie gesagt, mein Skript funktioniert ja, solange das Modul auch auf denselben Ordner zeigt.

    EDIT: Ist das Downloads-Modul nicht aktiv, dann steht zwar in meiner URL der richtige Link, z.B.:
    HTML-Code:
    https://xxx.de/kundenbereich?file=files/kunden/beispielkunde/chateau-de-chenonceau-1095268.jpg
    genau wie im Download-Modul auch, ich habe beides verglichen, es ist der gleiche Link. Räumt das Modul irgendwie Rechte ein oder sowas? Ruft es den Pfad anders auf? Aber das kann ja nicht sein, denn wenn das Modul aktiv auf der Seite vorkommt, funktioniert es ja- ich komm einfach nicht drauf
    Geändert von d33eniz (30.11.2017 um 10:56 Uhr)

  10. #10
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Dir fehlt dieser Teil: https://github.com/contao/core-bundl...ad.php#L57-L63
    Aber du solltest nicht diesen Code 1:1 kopieren sondern idealerweise überprüfen, ob der User die angeforderte Datei auch tatsächlich runterladen darf.

  11. #11
    Contao-Nutzer
    Registriert seit
    27.05.2014.
    Beiträge
    121

    Standard

    Puh, durchgelesen, versucht diese Sachen abzuändern/einzufügen, ich bin relativ am Ende. Ein paar simple Änderungen kann ich schon vornehmen, minimal PHP schreiben auch, aber jetzt wird es tatsächlich zu viel.
    Wie bekomme ich diese Abfrage nun hin?

    Vielleicht kann man mein Problem anders angehen:
    Kann ich irgendwie das Download-Modul so umschreiben/nutzen, dass er einfach relativ das HomeDir des jeweils angemeldeten Nutzers nimmt?

  12. #12
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Das kann das Downloads Inhaltselement von Haus aus....

  13. #13
    Contao-Nutzer
    Registriert seit
    27.05.2014.
    Beiträge
    121

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Das kann das Downloads Inhaltselement von Haus aus....


    Das ist doch nicht dein Ernst, ahahahaha Ich hätte mir den ganzen Spaß also sparen können, na super. Immerhin einiges dazugelernt, ich wusste wirklich nicht, dass es da einfach einen Haken hierfür gibt.

    Bonusfragen:
    - Ich muss aber trotzdem eine Quelldatei oder einen Quellordner angeben, ansonsten kommt eine Meldung mit "Bitte füllen Sie das Feld "Quelldateien" aus!". Kann man das irgendwie unterbinden? Ich habe jetzt einfach einen leeren Ordner ausgewählt, das sieht aber im Frontend etwas blöd aus. Wäre schön, wenn es hierfür eine simple Methode gäbe.

    - Wie sieht es aus, wenn etwas wieder gelöscht werden muss? Gibt es hierfür bereits etwas? Angenommen, etwas wurde falsch hochgeladen und sollte wieder weg- wie würde das gehen?

    Ansonsten Danke schonmal, das war mein ganzes Problem

  14. #14
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Du kannst ja einstellen, dass das Inhaltselement nur Mitgliedern angezeigt wird.

  15. #15
    Contao-Nutzer
    Registriert seit
    27.05.2014.
    Beiträge
    121

    Standard

    Richtig, danke

    Dann wäre das Problem gegessen.

    Nur für das Löschen von Dateien im Frontend gibt es wohl nach wie vor keine Lösung. Ich bin zwar hier drauf gestoßen:
    https://community.contao.org/de/show...chen!-ABER-WIE

    Aber die Erweiterung funktioniert wohl nicht unter 4.4.8

    Ansonsten habe ich mir folgendes durchgelesen:
    https://www.marcosimbuerger.ch/conta...-anzeigen.html
    Das scheint aber sehr unvollständig zu sein, abgesehen von den nicht erklärten Links. Aber ich denke es sind genügend Hinweise da, um da langfristig etwas zu machen, vorerst reicht mir das, vielen Dank an alle nochmals.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •