Erri: SAVE MODE OFF? Was meint ihr?

Hi,

ich habe ein Rechte-Problem bezüglich mkdir()... (siehe unten)
Dies habe ich meinen Provider mitgeteilt. Dieser hat mir angeboten, SAFE MODE in meinem Account zu deaktivieren.
Er meinte aber auch, dass dies ein Sicherheitsrisiko darstellt.

Was meint ihr, kann ich dies ohne weiteres auf OFF setzen lassen?

Kann mir jemand Links nennen, wo SAFE_MODE (Vor - Nachteile) erklärt ist?

Jetzt noch kurz zum Problem:
Ich erstelle per mkdir() einen Ordner "gal_1".
Dieser hat nach dem Erzeugen einen anderen Besitzer, als alle anderen Dateien / Verzeichnisse im Webspace.
Aus diesem Grund kann ich in diesem Ordner "gal_1" mit mkdir() leider keinen anderen Ordner "thumbs" anlegen, solange SAFE_MODE "on" ist, da die Datei oder das Verzeichnis ("gal_1"), denselben Eigentümer haben muss wie das Script, in dem mkdir() ausgeführt wird.

Viele Grüße und Vielen Dank,
Erri

  1. Hallo,
    also wenn Safe_Mode auf On steht, und man führt den Befehl mkdir(); durch, so wird erst überprüft ob einem der Ordner, in dem der Ordner erstellt werden soll überhaupt gehört.

    Aber ich denke mal dein Problem liegt bei den Schreib/Leserechten (CHMOD) und zwar muss der Ordner darüber, also der Ordner, in dem der neue Ordner per mkdir() erstellt werden soll, die Rechte: CHMOD 777 haben, sonst kann der Script keinen Unterordner erstellen.

    Den Safe Mode auf On zu lassen ist zu empfehlen.

    PHP Manual:
    http://www.php.net/manual/de/features.safe-mode.php

    MFG
    Andavos

    1. Hi Andavos,

      also wenn Safe_Mode auf On steht, und man führt den Befehl mkdir(); durch, so wird erst überprüft ob einem der Ordner, in dem der Ordner erstellt werden soll überhaupt gehört.

      Das ist mir bereits klar...

      Aber ich denke mal dein Problem liegt bei den Schreib/Leserechten (CHMOD) und zwar muss der Ordner darüber, also der Ordner, in dem der neue Ordner per mkdir() erstellt werden soll, die Rechte: CHMOD 777 haben, sonst kann der Script keinen Unterordner erstellen.

      Das dachte ich zunächst auch, aber selbst wenn ich mit CHMOD() die Rechte "0777" auf das Verzeichnis schreibe, funktioniert das nicht.

      Die Fehlermeldung, die mir ausgegeben wird, zeigt, dass es an Benutzer / Gruppe liegt:

      Warning: mkdir(): SAFE MODE Restriction in effect. The script whose uid/gid is 692/102 is not allowed to access /srv/www/htdocs/html/page/imgs/gal_1 owned by uid/gid 30/8 in /srv/www/htdocs/html/page/admin/new_gal.php on line 478

      Das Verzeichnis "gal_1", welches ebenfalls über mkdir() erstellt wurden ist, hat eben einen anderen Benutzer (nämlich den des Apache - wwwrun), als mein Script "new_gal.php"...

      Den Safe Mode auf On zu lassen ist zu empfehlen.

      Mmh, gibt es also keine andere Lösung für mein Problem?

      Viele Grüße und Vielen Dank,
      Erri

      1. Hallo!

        Das dachte ich zunächst auch, aber selbst wenn ich mit CHMOD() die Rechte "0777" auf das Verzeichnis schreibe, funktioniert das nicht.

        Also chmod 0777 ist eher selten der richtige Weg, damit wird die Datei, das Verzeichnis für _jeden_ User im System lesbar/veränderbar/löschbar. Wenn Dein Provider so "nett" ist Safe-Mode für einzelne User auszuschalten, können diejenigen also mit den 0777er Dateien/verzeichnissen machen was sie wollen. Wenn der Server zudem noch mit mod_php läuft (das schließe ich jetzt einfach mal aus der Tatsache dass "wwwrun" Verzeichnisse anlegt), funktioniert das sogar mit 0600 bei Dateien und 0700 bei Verzeichnissen (die "wwwrun" gehören). In jedem Fall wird man alles (z.B. auch DB-Zugangsdaten) lesen können. mod_php ist für Shared-Hosting "Provider" eh keine gute Idee, und dann noch safe_mode auszuschalte macht solche Manipulationen auch noch kinderleicht.

        Warning: mkdir(): SAFE MODE Restriction in effect. The script whose uid/gid is 692/102 is not allowed to access /srv/www/htdocs/html/page/imgs/gal_1 owned by uid/gid 30/8 in /srv/www/htdocs/html/page/admin/new_gal.php on line 478

        Das Verzeichnis "gal_1", welches ebenfalls über mkdir() erstellt wurden ist, hat eben einen anderen Benutzer (nämlich den des Apache - wwwrun), als mein Script "new_gal.php"...

        Du könntest das Verzeichnis "gal_1" so erstellen wie Du das Script erstellt/übertragen hast, vermutlich per FTP. Evtl. kannst Du auch per FTP einfach den Besitzer und die Gruppe des Verzeichnisses ändern.

        Zum Thema Safe-Mode: http://de3.php.net/features.safe-mode

        Safe-Mode bietet vor allem Dir einen gewissen - wenn auch keinen richtigen - Schutz vor anderen Anwendern auf demselben Server. Wenn jetzt der Safe-Mode noch für verschiedene Kunden ausgeschaltet wird, wird er damit ad absurdum geführt. Es ist zwar schön für den einzelnen wenn er nicht mehr den Beschränkungen des Safe-Modes unterliegt, dann kann er in die Verzeichnisse schreiben... aber nicht nur in die, sondern im Fall von mod_php ohne perchild- oder metux-MPM (die beide nur für Apache2 existieren und beide noch nicht als besonders stabil gelten) auch in die aller anderen Kunden. Und es muss nichtmal einer der anderen Kunden auf dem Server böse absichten haben, es reicht wenn er nur ein einziges unsicher programmiertes PHP-Script verwendet (z.B. alte phpbb Version, postnuke...), um fremden  Angreifern Tor und Tür zu öffnen.

        Grüße
        Andreas

        --
        SELFHTML Feature Artikel: http://aktuell.de.selfhtml.org/artikel/
        1. Hi Andreas,

          Das Verzeichnis "gal_1", welches ebenfalls über mkdir() erstellt wurden ist, hat eben einen anderen Benutzer (nämlich den des Apache - wwwrun), als mein Script "new_gal.php"...
          Du könntest das Verzeichnis "gal_1" so erstellen wie Du das Script erstellt/übertragen hast, vermutlich per FTP. Evtl. kannst Du auch per FTP einfach den Besitzer und die Gruppe des Verzeichnisses ändern.

          Das Verzeichnis "gal_1" ist ein Verzeichnis für eine Fotogalerie Nr. 1 (laufende Nummer)... in diesem Ordner sollen zwei Ordner "thumbs" "originalfotos" angelegt werden...
          Die soll der Website-User selbst anlegen können, deswegen kann ich den schlecht schon per FTP uploaden.
          Ich habe gerade mal geschaut, ob ich den User /die Gruppe im FTP ändern  kann... Die ist aber auch nicht möglich.

          Ist es bei meinem Problem nicht die einzige Möglichkeit, den Safe Mode zu deaktivieren?
          Jetzt weiß ich irgendwie gar nicht mehr, wie ich es lösen kann *grübel*
          Mein Provider wäre ja so nett, dass hat er mir bereits geschrieben...

          Viele Grüße und Vielen Dank,
          Erri

          1. Hi!

            Das Verzeichnis "gal_1" ist ein Verzeichnis für eine Fotogalerie Nr. 1 (laufende Nummer)... in diesem Ordner sollen zwei Ordner "thumbs" "originalfotos" angelegt werden...
            Die soll der Website-User selbst anlegen können, deswegen kann ich den schlecht schon per FTP uploaden.

            Wenn der Webserver nicht nur die Verzeichnisse erzeugt, sondern auch das Script müsste es gehen (Script per FTP umbenennen, PHP-Script schreiben welches den Quellcode einliest und in eine entsprechende .php Datei schreibt). Das Script wäre dann aber vermutlich für andere User veränderbar.

            Ich habe gerade mal geschaut, ob ich den User /die Gruppe im FTP ändern  kann... Die ist aber auch nicht möglich.

            Ja, da brauchst Du entsprechende Rechte.

            Ist es bei meinem Problem nicht die einzige Möglichkeit, den Safe Mode zu deaktivieren?

            Ist vermutlich das einfachste. Ich persönlich wäre aber von beiden Varianten nicht wirklich begeistert.

            Jetzt weiß ich irgendwie gar nicht mehr, wie ich es lösen kann *grübel*
            Mein Provider wäre ja so nett, dass hat er mir bereits geschrieben...

            Die Frage ist ob das vom Provider "nett" ist, oder "dumm", das kann ich anhand der bisherigen Angaben allerdings nicht mit Sicherheit sagen ;-)

            Grüße
            Andreas

            --
            SELFHTML Tipps & Tricks: http://aktuell.de.selfhtml.org/tippstricks/
            1. Hi Andreas,

              Wenn der Webserver nicht nur die Verzeichnisse erzeugt, sondern auch das Script müsste es gehen (Script per FTP umbenennen, PHP-Script schreiben welches den Quellcode einliest und in eine entsprechende .php Datei schreibt). Das Script wäre dann aber vermutlich für andere User veränderbar.

              Irgendwie erscheint mir das gerade unlogisch, denn:
              Kommt es nicht auf das Selbe raus wie wenn man SAFE MODE deaktiviert?
              Dann haben andere User auf dem Webserver auch Zugriff auf Dateien mit den Rechten (z.B. 777)

              Was wäre denn mit dem Open_Basedir, wie ich hier (https://forum.selfhtml.org/?t=103769&m=639412) geschrieben habe.

              Viele Grüße und Vielen Dank,
              Erri

              1. Hi!

                Irgendwie erscheint mir das gerade unlogisch, denn:
                Kommt es nicht auf das Selbe raus wie wenn man SAFE MODE deaktiviert?

                Ja, so würde es halt funktionieren wenn man den safe_mode nicht deaktivieren könnte. Da man den safe_mode deaktivieren kann bringt es Dir (und dem Provider und den anderen Kunden) IMHO auch nicht wirklich viel diesen eingeschaltet zu lassen.

                Dann haben andere User auf dem Webserver auch Zugriff auf Dateien mit den Rechten (z.B. 777)

                Das Problem bei mod_php ist halt, dass alle PHP-Script unter einem einzigen User laufen - bei Dir anscheinend wwwrun. Das heißt, prinzipiell haben alle Scripte von allen Usern dieselben Rechte, sie können gegenseitig Dateien lesen, je nach Konfiguration sogar Dateien verändern. Safe_Mode versucht dies einzuschränken, aber den PHP-Entwicklern selber ist klar dass dies nicht funktionieren kann: "Bezogen auf die Systemarchitektur, ist es der falsche Ansatz, diese Probleme innerhalb der PHP Schicht lösen zu wollen."

                Aufgrund sich häufender Sicherheits-Probleme in vielen Webanwendungen haben die PHP-Devs dies kürzlich in "A Note on Security in PHP" konkretisiert:

                For Local exploits we mostly hear about open_basedir or safemode
                problems on shared virtual hosts. These two features are there as a
                convenience to system administrators and should in no way be thought
                of as a complete security framework. With all the 3rd-party libraries
                you can hook into PHP and all the creative ways you can trick these
                libraries into accessing files, it is impossible to guarantee security
                with these directives. The Oracle and Curl extensions both have ways
                to go through the library and read a local file, for example. Short
                of modifying these 3rd-party libraries, which would be difficult for
                the closed-source Oracle library, there really isn't much PHP can
                do about this.

                Wenn man safe_mode für bestimmte Kunden auschaltet, ist selbst der geringe Schutz den safe_mode bietet weg.

                Daher setzen "gute" Provider anstatt mod_php lieber cgi oder fastcgi ein, da es hiermit die Möglichkeit gibt, PHP-Script unter einer anderen UID auszuführen, als den Webserver. Somit laufen die Scripte eines Anwenders immer unter seiner eigenen UID, so kann man mit den gewöhnlichen Unix-Dateirechten verhindern dass fremde User Zugriff auf eigene Scripte erhalten, und hat gleichzeitig nicht solche Probleme wie Du sie jetzt hast.

                Grüße
                Andreas

                --
                SELFHTML Linkverzeichnis: http://aktuell.de.selfhtml.org/links/
            2. Hello,

              Wenn der Webserver nicht nur die Verzeichnisse erzeugt, sondern auch das Script müsste es gehen (Script per FTP umbenennen, PHP-Script schreiben welches den Quellcode einliest und in eine entsprechende .php Datei schreibt). Das Script wäre dann aber vermutlich für andere User veränderbar.

              Wenn PHP als Modul läuft (ohne suphp/suexec), dann gibt es nur einen einzigen User für alle vom Webserver versorgten Domains und virtHosts, nämlich den Webserver.

              Dafür gibt es dann ja schließlich einerseits open_basedir und andereseits die Einschränkung, dass die Scripte nur auf Verzeichnisse desselben Owners zugreifen dürfen. Wenn man allerdings Dateien und Verzeichnisse mittels PHP erzeugen lässt, klappt diese "Sichheitsfunktion" nicht mehr, da diese dann ja dem Webserver gehören. Auf den Safe_Mode kann man meiner Meinung nach verzichten, wenn man die Liste der verbotenen Funktionen nutzt und open_basedir vernünftig wählt und session.save_path und upload_tmp_dir ebenfalls für jeden User getrennt einstellt.

              Harzliche Grüße aus http://www.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
              1. Hi Tom!

                Wenn PHP als Modul läuft (ohne suphp/suexec), dann gibt es nur einen einzigen User für alle vom Webserver versorgten Domains und virtHosts, nämlich den Webserver.

                Ja. Leider ist die von mir beschriebene Variante bei einigen Providern der einzige Weg - mit allen damit verbundenen Sicherheitsrisiken. Dazu kommen dann immer wieder Tipps wie "chmod 777", die sicherheitstechnisch denselben Effekt haben, im Prinzip ist das sogar noch ungünstiger da auch manipulierbar über andere Accounts als den Webserver.

                Dafür gibt es dann ja schließlich einerseits open_basedir und andereseits die Einschränkung, dass die Scripte nur auf Verzeichnisse desselben Owners zugreifen dürfen. Wenn man allerdings Dateien und Verzeichnisse mittels PHP erzeugen lässt, klappt diese "Sichheitsfunktion" nicht mehr, da diese dann ja dem Webserver gehören. Auf den Safe_Mode kann man meiner Meinung nach verzichten, wenn man die Liste der verbotenen Funktionen nutzt und open_basedir vernünftig wählt und session.save_path und upload_tmp_dir ebenfalls für jeden User getrennt einstellt.

                Naja, wie gesagt ist sowohl open_basedir als auch safe_mode "Flickerei", beide können das Problem nicht richtig lösen. Wirklich "dicht" wird es erst mit suphp/suexec oder vergleichbarem (metux/perchild). Zum Thema Funktionen zu verbieten, wußtest Du dass man curl oder oracle nicht verwenden darf weil beide lokale Dateien lesen können und somit open_basedir umgehen? Weißt Du was Du vielleicht noch vergessen haben könntest? Was ist wenn jemand eine solche Funktion unbedingt braucht? Daher würde ich in solchen Szenarien _grundsätzlich_ von mod_php abraten, solange metux oder perchild MPM noch nicht stabil sind.

                Grüße
                Andreas

                --
                SELFHTML Linkverzeichnis: http://aktuell.de.selfhtml.org/links/
                1. Hello,

                  Daher würde ich in solchen Szenarien _grundsätzlich_ von mod_php abraten, solange metux oder perchild MPM noch nicht stabil sind.

                  Daher würde ich in solchen Szenarien grundsätzlich dazu raten, dem Kunden eine eigene vServer-Zelle einzurichten. Da braucht man dann nämlich diese ganzen Krücken nicht, da bereits an der passenden Stelle die Trennung vorgenommen wurde.

                  Aber solange die Provider meinen "die Menge machts" und dafür die Qualität auf der Strecke bleibt, wird es z.B. auch immer wieder Lücken für Spammer geben, die einfach die großtechnischen Lücken der Provider ausnutzen.

                  Ich hatte vor einiger Zeit eine Untersuchung angestellt, ob man auf shared Hosting Servern spazieren gehen kann. Die Ergebnisse wurden dann in geschlossenen Kreisen veröffentlicht. Inzwischen hat sich einiges gebessert, aber damals waren die Einrichtungen katastrophal. Auf die Bezahlung warte ich allerdings noch heute.

                  Harzliche Grüße aus http://www.annerschbarrich.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau
    2. Hi nochmal,

      auf dieser Seite (http://www.php.net/manual/de/features.safe-mode.php)
      habe ich gerade folgendes gelesen:

      Wenn anstelle von safe_mode ein open_basedir Verzeichnis angegeben
      wurde, können Dateioperationen nur noch unterhalb dieses
      Verzeichnisses vorgenommen werden. Beispiel (Apache httpd.conf):

      Wenn ich meine phpinfo() schaue, sehe ich, dass open_basedir gesetzt ist auf: "/srv/www/htdocs/html/"

      Mein DocRoot habe ich über CONFIXX auf "/srv/www/htdocs/html/page" geändert...

      Habe ich das richtig verstanden, dass man (sofern "open_basedir" gesetzt ist) unterhalb des Open_Basedir trotzdem die Skripte ausführen kann, welche andere Benutzer / Gruppen als  Besitzer haben als ein Verzeichnis, in dem die Operation ausgeführt werden soll?

      Mein DocRoot liegt ja unterhalb des Open_Basedir. Warum funktioniert mkdir() dann bei mir nicht?

      Viele Grüße und Vielen Dank,
      Erri

      1. Hallo!

        Habe ich das richtig verstanden, dass man (sofern "open_basedir" gesetzt ist) unterhalb des Open_Basedir trotzdem die Skripte ausführen kann, welche andere Benutzer / Gruppen als  Besitzer haben als ein Verzeichnis, in dem die Operation ausgeführt werden soll?

        Nein. open_basedir sorgt dafür, dass Du aus Deinen PHP-Scripten heraus auf keine Dateien außerhalb des dort eingetragenen Verzeichnisses zugreifen kannst (bzw. versucht es wenigstens, Bibliotheken / externe Programme kennen diese Einschränkung z.B. nicht, selbiges gilt auch für safe_mode). Jedenfalls ist diese Einstellung unabhängig vom safe_mode. Wenn safe_mode aktiviert ist, gelten dessen Einschränkungen zusätzlich.

        Grüße
        Andreas

        --
        SELFHTML Linkverzeichnis: http://aktuell.de.selfhtml.org/links/
        1. Hi Andreas,

          Habe ich das richtig verstanden, dass man (sofern "open_basedir" gesetzt ist) unterhalb des Open_Basedir trotzdem die Skripte ausführen kann, welche andere Benutzer / Gruppen als  Besitzer haben als ein Verzeichnis, in dem die Operation ausgeführt werden soll?

          Nein. open_basedir sorgt dafür, dass Du aus Deinen PHP-Scripten heraus auf keine Dateien außerhalb des dort eingetragenen Verzeichnisses zugreifen kannst (bzw. versucht es wenigstens, Bibliotheken / externe Programme kennen diese Einschränkung z.B. nicht, selbiges gilt auch für safe_mode). Jedenfalls ist diese Einstellung unabhängig vom safe_mode. Wenn safe_mode aktiviert ist, gelten dessen Einschränkungen zusätzlich.

          Okay, das habe ich zumindestens verstanden.
          Dankeschön für deine Hilfe!

          Viele Grüße,
          Erri

  2. ... Dieser hat mir angeboten, SAFE MODE in meinem Account zu deaktivieren.
    Er meinte aber auch, dass dies ein Sicherheitsrisiko darstellt.

    Provider wechseln.

    Der "Safe Mode" bringt überhaupt keine zusätzliche Sicherheit, weil
    PHP nicht die einzige CGI-Scriptsprache ist, die auf Webservern
    vorinstalliert ist.
    Neben PHP gibt es in aller Regel auch "Perl" - und Perl kennt keinen
    solchen "Safe Mode" und quängelt daher auch nicht mit diesen nervigen
    Meldungen und schränkt Scripte auch nicht in ihrer Funnktion ein.
    Alles was man in PHP programmieren könnte, läßt sich immer auch als
    Perl-Script umschreiben.

    Einige Provider benutzen den "SafeMode" von PHP nur, um nochmal abzu-
    kassieren, wenn die Kunden doch echtes PHP brauchen. Die Leute bei
    deinem Provider hingegen haben einfach nur keinen rechten Durchblick.

    milky