FTP beschränken

  • Hallo,


    ich baue für meinen Bilderhoster im Moment eine Galeriefunktion auf. Alles funktioniert wunderbar, aber eine einzige Sache habe ich übersehen.


    Die Bilder werden von den Usern per FTP in ihre jeweiligen Galerien hochgeladen. Nun ist aber ein Beta-User auf die Idee gekommen, dort einfach mal sein Forum hochzuladen :eek: Das wäre aber eigentlich noch das kleinste Problem, aber wenn ein Schlaumeier dann mal auf die Idee kommt, die c99.php hochzuladen :rolleyes:


    Bin leider nicht der bewandertste in Sachen FTP-Server, zum User-Anlegen via shell_exec und das chrooten der User bin ich gerade noch fähig.


    Nun stellt sich mir natürlich die Frage, wie ich das in Zukunft unterbinden kann.


    Die Benutzer können zwischen zwei Galeriearten wählen, einem komplett normalen Verzeichnis und einer Variante mit vorinstalliertem Minishowcase.


    Wie stelle ich es nun an, dass der FTP-Upload nur für Bilder (.jpg, .gif, .bmp, .png) erlaubt ist?

  • Ich wüsste gerade nicht, wie das im Voraus gehen sollte. Per Cronjob alle ungewünschten Dateien löschen zu lassen ist nicht so ganz im Sinne des Erfinders. Als erste Gegenmaßnahme kannst du aber das hier in die vHost-Einstellungen aufnehmen:

    Code
    php_admin_flag engine off


    Damit schaltest du für diesen vHost die Ausführung von PHP ab. Ggf. musst du das noch in einen Directory-Block o.ä. packen, wenn du für Teile des vHosts (die nicht veränderbar sind) doch PHP brauchst.

  • Das wird so leider nicht funktionieren, weil ca. 50% der Galerien PHP benötigen und diese Verzeichnisse dynamisch von PHP angelegt werden. :(


    Genau deswegen dürfte auch ein Cronjob sehr schwer zu realisieren sein, weil ja in den Minishowcase-Galerien auch PHP-Dateien liegen.

  • Meine Struktur schaut so aus:


    /gallery | Hauptverzeichnis
    /gallery/$user | Wird dynamisch von PHP angelegt


    Verzeichnis (Minishowcase-Galerie): /gallery/$user
    Verzeichnis (Normales Upload-Verzeichnis): /gallery/$user


    Da liegt auch das Problem. Eine Unterscheidung zwischen Verzeichnissen, die PHP benötigen, und welchen die keins benötigen, ist praktisch unmöglich.

  • Was heißt "normales Upload-Verzeichnis"? Ich verstehe grad leider nicht, was genau du da bauen willst. Liegt denn die PHP-Datei zur Anzeige der Bilder im gleichen Verzeichnis wie die Bilder selbst und ist somit auch über FTP veränderbar oder zumindest einsehbar? Davon würde ich abraten. ;) Also wenn du das eh selbst schreibst, solltest du vielleicht auch auf diese Aspekte achten, indem du ein Verzeichnis pro User anlegst, in das wirklich nur die hochgeladenen Dateien kommen. Das wäre für die Sicherheit und Wartbarkeit bestimmt von Vorteil.

  • OK, also gut, ich versuch es ein bisschen besser zu erklären.


    Die User können zwischen zwei Varianten auswählen. Die Erste ist ein einfaches Verzeichnis, in das die Benutzer nach Belieben Dateien raufladen können. (Das ist das Problem.)


    Das Problem der zweiten Variante habe ich gerade gelöst, in dem ich die besagten User einfach in das /image Verzeichnis von Minishowcase eingesperrt und PHP dort ausgeschaltet hatte.


    Nur kann ich leider nicht global für alle Verzeichnisse in /gallery PHP ausschalten, weil sonst Minishowcase nicht mehr funktionieren würde.

  • So vielleicht?


    Code
    <DirectoryMatch "^/gallery/[^/]+/images">
       php_admin_flag engine off
    </DirectoryMatch>
    
    
    
    
    <FilesMatch "^/gallery/[^/]+/showcase.php$">
       php_admin_flag engine on
    </FilesMatch>


    Damit würde das für showcase.php wieder eingeschaltet werden... allerdings bleibt eine Lücke, denn ein Benutzer könnte ja selbst eine showcase.php hochladen. Deine Vorstellungen sind aber auch wirklich nicht einfach umzusetzen. ;) Und wenn du die beliebigen Dateien auch in ein Unterverzeichnis verschiebst? Dann wären die Dateien eben unter http://example.gallery.tld/files/bild.jpg erreichbar...

  • Zitat

    ... allerdings bleibt eine Lücke, denn ein Benutzer könnte ja selbst eine showcase.php hochladen.


    Gut, damit werde ich wohl leben müssen :o


    Insofern funktioniert es jetzt auch. Danke!

  • Zitat von Mo3;19282

    Gut, damit werde ich wohl leben müssen :o


    Hm, sagen wir mal so.. du hast (zumindest, wenn du die Einstellungen aus dem anderen Thread verwendest) keinen Open Base Dir gesetzt, somit kann PHP auf die Dateien zugreifen, die der Apache erreichen kann. Selbst wenn du ihn setzt, geht das aufgrund der Dynamik höchstens auf /gallery zu beschränken. Wenn jemand eine showcase.php hochlädt, kann er also die Daten auch für andere Benutzer lesen/schreiben. Und Shell-Befehle ausführen. Ein Angreifer müsste also nur c99.php in showcase.php umbenennen... nicht so gut.


    Dann würde ich lieber zusehen, dass von http://example.gallery.tld/bild.jpg intern auf einen Unterordner weitergeleitet wird oder so.

  • Wenn deine User das jetzt schon ausnutzen hast d dann mal über nen Uploadscript nachgedacht wo du wirklich nur Bilder erlaubst?
    Ist zwar für die User umständlicher aber da weißt du das die wirklich nur Bilder uploaden können.



    MfG
    Andre

  • Oder du machst einen über HTTP nicht erreichbaren Upload-Bereich, der dann entweder regelmäßig oder/und über eine Seite überprüft wird und nach dem Aschenputtel-Prinzip die Dateien in den öffentlichen Bereich verschoben bzw. gelöscht werden.


    Ansonsten gibt es ja noch Flash-Uploader, mit denen man auch recht bequem mehrere Dateien hochladen kann, ohne jede einzeln auswählen zu müssen. Bei ZIP-Dateien muss man ggf. das Upload-Limit hochsetzen, und man sieht nicht, wie weit der Upload vorangeschritten ist und kann ihn nicht später fortsetzen. Dafür kann man sie natürlich leichter kontrollieren.

  • Habe mich nochmal damit auseinandergesetzt.


    Wieso funktioniert dieser Code nicht?



    Wenn dieser Code funktioniert, wird PHP ausgeschaltet (Ausnahme: Die drei Gallerie-Dateien). Zusätzlich läuft noch ein Cronjob, der die Größe der drei PHP-Dateien überwacht und bei Veränderung sofort die Gallerie löscht und den User sperrt.

  • 1. Dein DocumentRoot ist in /var/www/gallery, die Einstellungen für PHP machst du aber für /gallery.


    2. Nimm lieber Directory statt DirectoryMatch. Sorry, wusste nicht, dass das auch Wildcards unterstützt.

  • Ausgewechselt. Will aber immer noch nicht laufen - beim Aufruf der /index.php in /var/www/gallery/* öffnet sich trotzdem ein Downloadfenster.