Jens: Fehler beim erstellen einer Datei

Hi,

ich habe auf meiner Homepage einige Script, die z.B. die EMail-Adresse eines Nutzers der meinen Newsletter abboniert in einer Textdatei speichern sollen. Wenn ich die Datei im aktuellen Verzeichniss anlegen will gibt PHP folgende Warnung aus:
Permission denied in /home/www/web22/html/newsletter2.php4 on line 88

Wenn ich einen neuen Ordner anlege, in dem Jeder Schreib- und Leserechte hat funktioniert es.

Stellt diese Konfiguration ein Sicherheitsrisiko dar?
D.h.
1. ein Server der den Pfad der Datei kennt kann diese lesen, und so die E-Mail Adressen meiner Gäste erlangen.
2. Haben andere Benutzer die Möglichkeit die Datei zu verändern? (schreibrechte hat ja jeder.)

Wie kann ich beide oben genannten Risiken ausschließen, oder würdet Ihr die speicherung solcher Daten grundsätzlich anders lösen?

mfg

Jens

  1. Hallo,

    Wenn du den Ordner mit der Datei mit .htaccess absicherst, sollte es von außen eigentlich schwerer werden, an den Inhalt der Datei zu kommen, während du vom Server selbst keine Probleme hast.

    |Permission denied in /home/www/web22/html/newsletter2.php4 on line 88

    Rechte für das Verzeichnis setzen, dann sollte es klappen!

    cu Benedikt Loepp

    --
    visite http://www.webocton | [gw] bigBENNE | Benedikt Loepp
  2. Wenn ich einen neuen Ordner anlege, in dem Jeder Schreib- und Leserechte hat funktioniert es.

    Stellt diese Konfiguration ein Sicherheitsrisiko dar?
    D.h.

    1. ein Server der den Pfad der Datei kennt kann diese lesen, und so die E-Mail Adressen meiner Gäste erlangen.

    a) Du meinst sicher einen Webclient, Server servieren nur, bestellen aber nichts :)

    b) Das hat nicht unbedingt etwas mit den Leserechten des Verzeichnisses zu tun, vielmehr sind die Ausführungsrechte des Verzeichnisses gefragt. Und natürlich die Rechte der Datei selber.
    Wie aber Benedikt bereits schrieb, kannst Du den Zugriff über HTTP (also den Webserver) mit entsprechender Webserverkonfiguration (Apache: .htaccess) verhindern, unabhängig von den Dateirechten.

    1. Haben andere Benutzer die Möglichkeit die Datei zu verändern? (schreibrechte hat ja jeder.)

    Generell: Ja. Sofern ein Hoster halbwegs auf Draht ist, hat er aber zumindest in PHP eine Sperre namens safe_mode aktiviert, die grundsätzlich verhindert, daß man fremde Dateien, wie auch immer die Rechte gesetzt sein mögen, nutzen kann. Das ändert aber nichts daran, daß jeder andere Nutzer des Servers per CGI-Programm (oder mit Shell-Zugang) Deine Datei einsehen, ändern oder löschen/leeren kann.

    Kurz: Du hast ein Problem. Wie groß das ist, mußt Du selbst entscheiden.

    Wie kann ich beide oben genannten Risiken ausschließen, oder würdet Ihr die speicherung solcher Daten grundsätzlich anders lösen?

    Die Risiken dieser Lösung kannst Du selbst nicht umgehen, das ist technisch nicht möglich. Sie dazu den Thread [pref:t=49478&m=270354] ein paar Zeilen weiter unten.

    Ist Dir der einzige Ausweg, der Wechsel des Hosters, nicht genehm, bleibt Dir als eine ein klein wenig sicherere Lösung lediglich die Nutzung einer Datenbank, die über eine eigene Zugriffskontrolle verfügt (MySQL zum Beispiel). Aber auch dort hast Du das Problem, daß jeder Deine PHP-Skripte einsehen kann und dementsprechend auch an Kennung und Passwort zur Datenbank kommt, man muß nur etwas länger suchen.

    Gruß,
      soenk.e

    1. Zunächst vielen Dank für eure Antworten.

      ich habe noch ein paar Fragen:

      Generell: Ja. Sofern ein Hoster halbwegs auf Draht ist, hat er aber zumindest in PHP eine Sperre namens safe_mode aktiviert, die grundsätzlich verhindert, daß man fremde Dateien, wie auch immer die Rechte gesetzt sein mögen, nutzen kann. Das ändert aber nichts daran, daß jeder andere Nutzer des Servers per CGI-Programm (oder mit Shell-Zugang) Deine Datei einsehen, ändern oder löschen/leeren kann.

      Wenn ich dich richtig verstanden habe kann ich über .htaccess den Zugriff über den Webserver sperren. Alle anderen User, die ftp- oder shell-Zugang zum Server haben können aber meine Dateien lesen und bearbeiten.

      Ist Dir der einzige Ausweg, der Wechsel des Hosters, nicht genehm,

      Worauf muß ich wenn ich den Hoster wechseln sollte achten, damit ich dieses Problem da nicht habe (d.h. was machen andere Hoster anders, bzw. meiner falsch).

      bleibt Dir als eine ein klein wenig sicherere Lösung lediglich die Nutzung einer Datenbank, die über eine eigene Zugriffskontrolle verfügt (MySQL zum Beispiel). Aber auch dort hast Du das Problem, daß jeder Deine PHP-Skripte einsehen kann und dementsprechend auch an Kennung und Passwort zur Datenbank kommt, man muß nur etwas länger suchen.

      und wenn ich anderen Nutzern für die php-Datei nur ausführen und kein lese-Recht einräume, kann dann immer noch der Quelltext betrachtet werden?

      Viele Grüße

      Jens

      1. Wenn ich dich richtig verstanden habe kann ich über .htaccess den Zugriff über den Webserver sperren. Alle anderen User, die ftp- oder shell-Zugang zum Server haben können aber meine Dateien lesen und bearbeiten.

        Nicht ganz:

        • Per FTP sollte niemand Zugriff haben, weil man in dem Falle eigentlich immer im eigenen Verzeichnis landet und dieses aus Sicht des FTP-Clients das Wurzelverzeichnis darstellt (Stichwort "chroot", das Wurzelverzeichnis ist sozusagen die Mutter aller Verzeichnisse).
        • Per Direkteingabe im Webbrowser: Nein, wegen .htaccess.
        • Per Shell-Zugang: Ja, uneingeschränkt.
        • Per CGI-Anwendung über den Webserver: Ja, wenn suexec.

        Beachte bitte nichtsdestotrotz, daß das Sicherheitsloch zwar da, aber wenig bekannt ist. Andererseits haben gerade die Leute, denen es bekannt ist, immer einen Heidenspaß daran :>

        Worauf muß ich wenn ich den Hoster wechseln sollte achten, damit ich dieses Problem da nicht habe (d.h. was machen andere Hoster anders, bzw. meiner falsch).

        Das ist ein Problem der Rechteeinteilung. Eine Datei hat Rechte für eine Person und zwei Gruppen: für den Eigentümer ("owner"), für eine zu benennende Gruppe ("group") und für den Rest der Welt ("other"). Der Webserver läuft unter einer eigenen Identität. Jeder Benutzer hat meistens eine eigene Gruppe (in der er einzigstes Mitglied ist). Man kann nun dieser Gruppe den Webserver hinzufügen, die Gruppenrechte entsprechend nutzen (lesen, evt. auch schreiben) sowie dem Rest der Welt sämtliche Rechte nehmen. Somit hätten zwar Eigentümer und Webserver (über die Gruppe) Lese- und/oder Schreibrechte, aber sonst niemand.

        Der Haken an der Sache ist, daß auf den meisten Systemen die Anzahl der Gruppen, denen eine Identität angehören darf, auf eine geringe Zahl begrenzt ist; diese Obergrenze ist im Betriebssystem festgelegt (und mit _fest_gelegt meine ich _fest_gelegt). Hat ein Hoster 100 Kunden auf einem Server, müsste der Webserver nach obigem Schema 100 Gruppen zugeordnet werden. Lässt das System nur ein Maximum von 32 Gruppen zu, gibt es ein Problem. Es bleibt dann nur übrig, allen (also "other", s.o.) die benötigten Rechte einzuräumen, so wie es bei Dir im Moment der Fall ist.

        Da nicht gerade wenige Hoster lediglich Wiederverkäufer ("Reseller") sind oder sonst irgendwie einen Server gemietet ("Root-Server", "Virtual Server"), aber keine großartige Ahnung davon haben, wirst Du es schwer haben einen Hoster zu finden, der sich um dieses Problem gekümmert hat, geschweige denn darum kümmern könnte, wenn er denn wollte. Die ganz Großen nehmen wir mal davon aus, allerdings haben die andere Nachteile. Und ich für meinen Teil wäre ein ganz mieser Lump, wenn ich an diesem Ort darauf hinweisen würde, daß ich mich darum gekümmert habe ;)

        und wenn ich anderen Nutzern für die php-Datei nur ausführen und kein lese-Recht einräume, kann dann immer noch der Quelltext betrachtet werden?

        PHP-Skripte sind in aller Regel keine eigenständigen Programme, sondern bedürfen des Webservers, um ausgeführt zu werden, und zwar schlicht und ergreifend, weil der PHP-Interpreter im Webserver steckt. Es wird Dir also nichts bringen, Ausführungsrechte zu vergeben, weil der Webserver Leserechte braucht, um das Skript zu lesen und dann an seinen PHP-Interpreter zu verfüttern.
        Die Ausnahme von dieser Regel: PHP-Skripte werden als CGI-Anwendung ausgeführt. Das ist allerdings eher selten der Fall, phpinfo() sollte Auskunft geben (erster Block, "Server-API" o.ä.).

        Gruß,
          soenk.e

        1. Ich Danke dir für deine sehr informative und hilfreiche Antwort.
          Ich habe mich bereits wegen CGI und Shell Zugang mit meinem Hoster in Verbindung gesetzt und werde die vorhandene Sicherheitslücke siche bald schließen können

          Viele Grüße

          Jens

        2. Hallo, soenk.e

          hochinteressant. Dennoch habe ich noch einige Fragen:

          1. Wenn nun ein anderer user per PHP (also Eigentümer "nobody") eine Datei angelegt hat kann ich dann - egal welche Rechte die Datei hat - per PHP (wiederum "nobody") darauf zugreifen?

          2. D.h. ich könnte per fopen("/pfad/zu/anderem/user/auf/demselben/server/file.html", "w") -
          wenn die Gruppe "other" in der Datei file.html Schreibrechte hätte - diese lesen bzw. beschreiben??

          Gruß,
            soenk.e

          Philip

          --
          :::::::: http://www.metrox.de ::::::::

            1. Wenn nun ein anderer user per PHP (also Eigentümer "nobody") eine Datei angelegt hat kann ich dann - egal welche Rechte die Datei hat - per PHP (wiederum "nobody") darauf zugreifen?

            Jein. Aus Sicht des Systems schon, aus Sicht von PHP nicht, allerdings nur, wenn die PHP-Option Safe Mode eingeschaltet ist. Diese bewirkt nämlich, daß ein Skript auf nicht auf Objekte zugreifen kann, deren Eigentümer (optional: deren Gruppe) nicht mit dem Eigentümer (Gruppe) der Skriptdatei übereinstimmt.

            Der Safe Mode sollte normalerweise eingeschaltet sein. Wie das und anderes in der Realität aussieht, zeigt ein Artikel aus dem letzten Jahr in der c't (http://www.heise.de/ct/02/14/072/), Zitat: "Offensichtlich sind viele Provider nicht willens oder in der Lage, ihren Kunden eine sichere Server-Umgebung zu bieten."

            1. D.h. ich könnte per fopen("/pfad/zu/anderem/user/auf/demselben/server/file.html", "w") -
              wenn die Gruppe "other" in der Datei file.html Schreibrechte hätte - diese lesen bzw. beschreiben??

            Ja, mit obiger Einschränkung.

            Gruß,
              soenk.e

            1. Hallo, soenk.e

              Erstmal danke für die Antwort...

              1. Wenn nun ein anderer user per PHP (also Eigentümer "nobody") eine Datei angelegt hat kann ich dann - egal welche Rechte die Datei hat - per PHP (wiederum "nobody") darauf zugreifen?

              [...] Diese bewirkt nämlich, daß ein Skript auf nicht auf Objekte zugreifen kann, deren Eigentümer (optional: deren Gruppe) nicht mit dem Eigentümer (Gruppe) der Skriptdatei übereinstimmt.

              Und wenn ich die php-Datei von einer anderen PHP-Datei erstellen lasse?
              -> Eigentümer des Scripts: nobody
              -> Eigentümer der Datei, auf die ich zugreifen will: nobody
              Dann müssts doch gehen??

              Gruß,
                soenk.e

              mfg,
              Philip

              --
              :::::::: http://www.metrox.de ::::::::

                1. Wenn nun ein anderer user per PHP (also Eigentümer "nobody") eine Datei angelegt hat kann ich dann - egal welche Rechte die Datei hat - per PHP (wiederum "nobody") darauf zugreifen?

                [Safe Mode] Diese bewirkt nämlich, daß ein Skript auf nicht auf Objekte zugreifen kann, deren Eigentümer (optional: deren Gruppe) nicht mit dem Eigentümer (Gruppe) der Skriptdatei übereinstimmt.

                Und wenn ich die php-Datei von einer anderen PHP-Datei erstellen lasse?
                -> Eigentümer des Scripts: nobody
                -> Eigentümer der Datei, auf die ich zugreifen will: nobody
                Dann müssts doch gehen??

                Äh, ja, aber dann sind wir gewissermaßen wieder da, wo wir angefangen haben, bei der Frage, die bereits ganz oben steht: Statt über ein simples CGI-Skript oder die Shell kann dann ein jeder über ein genauso simples PHP-Skript Deine Skripte und erstellten Dateien lesen oder löschen. Und das angesichts der Tatsache, daß Du höchstselbst jetzt nicht einmal mehr direkten FTP/Shell-Zugriff auf Deine eigenen Dateien hast. Mal ganz zu schweigen davon, daß deutlich mehr Kiddies mit PHP rumdaddeln als mit CGI-Geschichten.

                Es sollte nicht unerwähnt bleiben, daß es eventuell (ich hab's noch nicht ausprobiert) eine Möglichkeit gibt, die Zugriffe von PHP-Skripten auf fremde Verzeichnisse zu unterbinden, aber diese Möglichkeit steht nur dem Server-Administrator offen. Und wenn der anfängt, statt die Ursache zu beseitigen an den Symptomen rumzudoktern..naja :]

                Gruß,
                  soenk.e

                1. Hallo, soenk.e

                  Und wenn ich die php-Datei von einer anderen PHP-Datei erstellen lasse?
                  -> Eigentümer des Scripts: nobody
                  -> Eigentümer der Datei, auf die ich zugreifen will: nobody
                  Dann müssts doch gehen??

                  Äh, ja, aber dann sind wir gewissermaßen wieder da, wo wir angefangen haben, bei der Frage, die bereits ganz oben steht: Statt über ein simples CGI-Skript oder die Shell kann dann ein jeder über ein genauso simples PHP-Skript Deine Skripte und erstellten Dateien lesen oder löschen.

                  Das ist mir schon klar. Ich wollt nur genauer wissen, wie so ein Zugriff auf meine Dateien konkret aussehen könnte.
                  Nunja... Danke für deine interessanten und ausführlichen Antworten

                  Gruß,
                    soenk.e

                  mfg,
                  Philip

                  --
                  :::::::: http://www.metrox.de ::::::::