Philipp Hasenfratz: SAFE MODE Restriction bei "verschachteltem"mkdir

Halihallo alle

Folgendes:

Server: Linux alpha 2.4.21-202
PHP-Version: 4.3.4
Webserver: Apache

safe_mode On
safe_mode_exec_dir /usr/bin/apache
safe_mode_gid Off

<?
  phpinfo();

ini_set('display_errors',true);
  ini_set('error_reporting', E_ALL);

mkdir('./data/test');        // funktioniert
  mkdir('./data/test/test');   // Safe Mode Restr., line 8
?>

ergibt folgendes:
Warning: mkdir(): SAFE MODE Restriction in effect. The script whose uid is 20191 is not allowed to access /home/bla/ftp/www/security/data/test owned by uid 30 in /home/bla/ftp/www/security/t.php on line 8

Nun. Was SAFE MODE ist, was die Fehlermeldung bedeutet ist mir alles
klar (glaube ich zumindest...). Nur:

Das erste Verzeichnis kann erfolgreich angelegt werden. Im gleichen
Script wird dann versucht ein Unterverzeichnis anzulegen, was jedoch
mit der genannten Fehlermeldung abbricht. Nun sollte die uid des
Scriptes sich ja zwischen diesen zwei Anweisungen nicht ändern...

Ach, ja, was mir sonst noch aufgefallen ist und mir auch spanisch
vorkommt:

PHP scheint nicht unter den selben Berechtigungen/User zu laufen, wie
unter welchem FTP die Daten ablegt. Z.B. musste ich die Permissions
eines Verzeichnisses auf 0666 erhöhen, um mit PHP überhaupt ein
Unterverzichnis anlegen zu können (mitunter write-permission für
everyone, PHP läuft noch nichtmal unter derselben Gruppe).
Vielleicht hängt das zusammen...

Also hier scheint mir ein deutlicher Konfigurationsfehler
vorzuliegen... Leider bin ich hier blind, habe keinen Zugriff auf
die Konfigurationsdateien, kein SSH, nur FTP... Zudem studiere ich
schon eine Weile daran rum und habe vielleicht den Überblick und die
Logik verloren...

Hat von euch jemand eine Idee?

Kann mir jemand sagen, woran dies liegt?

Viele Grüsse

Philipp

--
The only program that runs perfectly every time, is a virus.
  1. Hello Philipp,

    genau dieses Problem hate ich neulich erst ausführlich erklärt.
    Der Thread mag gerade mal eben im Archiv verschwunden sein.
    Such einfach mal nach "safe mode tom" dann wirst Du es schon wiederfinden.

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    1. Halihallo Tom

      Danke für Deine Antwort!

      genau dieses Problem hate ich neulich erst ausführlich erklärt.
      Der Thread mag gerade mal eben im Archiv verschwunden sein.
      Such einfach mal nach "safe mode tom" dann wirst Du es schon wiederfinden.

      Zusammenfassung für Nachfolgendes:
      ----------------------------------
      Verzeichnisse können nur per FTP angelegt werden. Über PHP und
      Webserverbenutzer erscheint immer SAFE MODE Restriction, da der
      Owner des Verzeichnisses (ftp) nicht mit dem User des Scriptes
      (wwwrun) übereinstimmt. Jedes Script, ob über PHP (über Webserver
      gestartet) als wwwrun oder FTP hochgeladen scheitert an SAFE MODE.

      und ein <cite /> von ganz unten:
      Was mich eben fasziniert hat: Ein Verzeichnis _wurde_ ja angelegt,
      aber das Unterverzeichniss dieses brach mich Restriction ab. Also:
      Erstelle ich ein PHP-Script über PHP-Prozess unter wwwrun, kann ich
      absolut keine Verzeichnisse erstellen, da der Parent natürlich ein
      Verzeichnis des FTP-Servers ist (und sei es nur der Document-Root).
      Lade ich es normal über FTP-Server hoch, kann ich wenigstens _ein_
      Verzeichnis erstellen, aber keine Unterverzeichnisse mehr,
      als ob sich der User _zwischen zwei mkdir's_ ändert... :-)
      ----------------------------------

      Ich bin fündig und habe mich durchgelesen. Der Sinn des Upload-
      Scripts ist mir bewusst geworden, ebenso, dass sich die User von
      FTP und Webserver unterscheiden und man die Verzeichnisse somit über
      ein Script (welches unter dem Webserver läuft) angelegt werden
      müssen, sodass der andere Scripte unter dem Webserver-UID auch darauf
      zugreifen können.

      Was ich nun gemacht habe:
      Ich habe ein Script t.php (FTP-Upload) erstellt, welches tt.php (FTP-
      Upload) einliest und unter ttt.php speichert. Hm. Das sollte jetzt
      doch unter Benutzer wwwrun gespeichert sein? - Interpretiere ich
      hier die FTP-Ausgaben falsch?:

      -rw-r--r--   1 ftp      ftp           228 Apr 21 14:10 t.php
      -rw-r--r--   1 ftp      ftp           183 Apr 21 14:13 tt.php
      -rw-r--r--   1 ftp      ftp           183 Apr 21 14:13 ttt.php

      oder ist das Script ttt.php immer noch Benutzer "FTP"? - Oder wird
      das immer ausgegeben...

      Wie auch immer:
      Das neue Script ttt.php (wwwrun?) Script startet und bricht mit
      gleicher Fehlermeldung ab:

      Warning: mkdir(): SAFE MODE Restriction in effect. The script whose
      uid is 30 is not allowed to access /home/daa.ch/ftp/www/security
      owned by uid 20191 in /home/daa.ch/ftp/www/security/ttt.php on line 7

      Ich kann also schlicht gar keine Unterverzeichnisse anlegen. Ich habe
      das Parentverzeichnis "security" auch auf read/write/execute für
      all gesetzt. Ohne Änderung, PHP erkennt unterschiedliche uid und dann
      ist Feierabend.

      Was mich eben fasziniert hat: Ein Verzeichnis _wurde_ ja angelegt,
      aber das Unterverzeichniss dieses brach mich Restriction ab. Also:
      Erstelle ich ein PHP-Script über PHP-Prozess unter wwwrun, kann ich
      absolut keine Verzeichnisse erstellen, da der Parent natürlich ein
      Verzeichnis des FTP-Servers ist (und sei es nur der Document-Root).
      Lade ich es normal über FTP-Server hoch, kann ich wenigstens _ein_
      Verzeichnis erstellen, aber keine Unterverzeichnisse mehr,
      als ob sich der User _zwischen zwei mkdir's_ ändert... :-)

      Kann es echt sein, dass ich den Wald vor lauter Bäumen nicht mehr
      sehe?

      Ich fühle mich schon fast so, wie bei dem Perl-Problem von
      neulich :-)

      Viele Grüsse

      Philipp

      --
      The only program that runs perfectly every time, is a virus.
      1. Halihallo zusammen

        [...]
        Falls sich mein Problem wirklich nicht von den anderen, durch Tom
        beantworteten, unterscheidet (und ich das nicht erkenne), so könnt
        ihr mir das natürlich sagen und ich lese alles normals wirklich
        peinlich genau durch. Aber im Moment bin ich der Überzeugung, dass
        der Hund wo anders begraben liegt...

        Viele Grüsse

        Philipp

        --
        The only program that runs perfectly every time, is a virus.
        1. Hello,

          nochmal rückgefragt:

          Darf der wwwrun ein Verzeichnis oder eine Datei in deinem PHP-BaseDir anlegen? Wenn Du also mit FTP ein Script hochlädtst welches eine Datei anlegen soll, funktioniert das? Dasselbe Script dürfte dann allerdings die von ihm selbst angelegte Datei nicht mehr bearbeiten.

          if (Ist das so?)
          {
            Dann lies nochmal alles in Ruhe durch.
          }
          else
          {
            beschreib nochmal in kleinen Schritten, was Du tust und was wann die
            Fehlermeldungen sind
          }

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          1. Halihallo Tom

            Darf der wwwrun ein Verzeichnis oder eine Datei in deinem PHP-BaseDir anlegen? Wenn Du also mit FTP ein Script hochlädtst welches eine Datei anlegen soll, funktioniert das? Dasselbe Script dürfte dann allerdings die von ihm selbst angelegte Datei nicht mehr bearbeiten.

            Dem ist IMHO nicht so. wwwrun kann weder Datei noch Verzeichnis
            erstellen; dies kann - wie es scheint - nur über FTP geschehen.

            Was ich gemacht habe:

            1. Script t.php erstellt:
            <?
              ini_set('display_errors',true);
              ini_set('error_reporting', E_ALL);
              mkdir( 'test123', 0755 );
              fclose(fopen("test123.txt", "w"));
            ?>

            2. Script über FTP auf den Server geladen. Dort liegt es unter
            www.test.ch/t.php (der Vorsicht halber habe ich es gleich im
            Document-Root versucht, um eigene Unterverzeichnis-Permission-
            Probleme auszuschliessen, die ich mir ggf. selbst eingehandelt
            habe. Am Document-Root habe ich keine Änderungen vorgenommen)

            3. Script auf www.test.ch/t.php gestartet (Browser|HTTP)

            4. Es erscheinen folgende Warnmeldungen:
            ---
            Warning: mkdir(test123): Permission denied in /home/test.ch/ftp/www/t.php on line 4

            Warning: fopen(test123.txt): failed to open stream: Permission denied in /home/test.ch/ftp/www/t.php on line 5

            Warning: fclose(): supplied argument is not a valid stream resource in /home/test.ch/ftp/www/t.php on line 5
            ---

            Fazit: Ein über HTTP|Webserver gestartetes Script hat lediglich
            Lesezugriff auf alle Dateien. Der Lesezugriff ist damit zu erklären,
            dass die Permissions des Document-Root auf 0755 gesetzt sind und
            somit jeder Lesezugriff hat, nicht jedoch Schreibzugriff (dies hat
            nur der Owner).

            Zweiter Test mit Script-Upload versuche ich morgen nochmals, dann
            mache ich das ganze nochmals über ein Script, welches eine Datei
            anlegt (das habe ich bereits geschafft, indem ich dem
            Parentverzeichnis höhrere Permissions verpasst habe, sodass auch
            everyone Schreibzugriff hat, nicht nur der Owner). Aber höhrere
            Berechtigungen zu vergeben kann nicht Sinn und Zweck der Aktion sein.

            Nun, wie gesagt. Der zweite Test (über ein Script ein Script
            erstellen|uploaden und dieses starten) wird morgen folgen.
            Ich hatte es heute ja schon versucht, nur wage ich mich hierzu nicht
            mehr zu äussern, da ich nicht mehr alles weiss. Auf jedenfall lief
            es im Endeffekt auf folgendes heraus:

            Upload über FTP: Permission denied.
            Upload über Webserver/Script: SAFE MODE Restriction: uid's stimmen
               nicht überein.

            Nun, danke vorerst für Deine Bemügungen. Ich sehe und spreche morgen
            weiter; jetzt muss ich mich beim Tennis erstmal meinen Kopf
            abkühlen und neue Denkenergie sammeln :-)

            Viele Grüsse

            Philipp

            --
            The only program that runs perfectly every time, is a virus.
          2. Halihallo Tom

            beschreib nochmal in kleinen Schritten, was Du tust und was wann die
              Fehlermeldungen sind

            So, jetzt nochmals der Versuch über ein Upload-Script, welches ein
            Script unter User wwwrun ablegen soll, sodass dann ggf. die
            Zugriffsberechtigungen gegeben sind:

            1. Upload des "Upload-Scripts" t.php über FTP:

            <?
              ini_set('display_errors',true);
              ini_set('error_reporting', E_ALL);
              $fh = fopen("./script.php","r");
              $nh = fopen("./wwwrunscript.php","w");
              while ( $line = fgets($fh) ) {
                fputs($nh,$line);
              }
              fclose($nh);
              fclose($fh);
            ?>

            2. Upload des "script.php" über FTP, welches dann von t.php ein-
               gelesen wird und die Datei wwwrunscript.php unter User wwwrun
               Ablegt.

            <?
              ini_set('display_errors',true);
              ini_set('error_reporting', E_ALL);

            mkdir('test123', 0755);
              fclose(fopen("test.txt","w"));
            ?>

            3. Starten des "Upload-Scripts" t.php über Browser (es sollte dann
               wwwrunscript.php auf dem Server liegen, welche dann eben unter
               User wwwrun gespeichert ist).

            3.1 erster Versuch gescheitert. Siehe auch anderes Posting, über
                   FTP hochgeladene Scripte können Dateien/Verzeichnisse _nur_
                   lesen. Das Schreiben von wwwrunscript.php ist mit folgender
                   Warnung abgebrochen:

            Warning: fopen(./wwwrunscript.php): failed to open stream: Permission denied in /home/test.ch/ftp/www/t.php on line 5

            Warning: fputs(): supplied argument is not a valid stream resource in /home/test.ch/ftp/www/t.php on line 7

            4. Ich werde also die Permissions von "www" erhöhen auf 0777 (full-
               access)

            4.1 Nochmaliges starten von t.php, jetzt sollte wwwrunscript.php
                erstellt werden können:

            OK. Script lief ohne Fehler. wwwrunscript.php wurde erstellt,
                hat richtigen Inhalt (logischerweise denselben wie script.php,
                welches per FTP hochgeladen wurde). wwwrunscript.php sollte
                jetzt also unter User wwwrun laufen.

            5. Jetzt sollte ich das neu generierte wwwrunscript.php über Browser
               starten können und das Verzeichnis und die Datei sollte angelegt
               werden können, richtig?

            Mal sehen: Ich starte also den Browser und tippe
               www.test.ch/wwwrunscript.php ein. Negativ, folgende Ausgabe:

            Warning: mkdir(): SAFE MODE Restriction in effect. The script whose uid is 30 is not allowed to access /home/test.ch/ftp/www owned by uid 20191 in /home/test.ch/ftp/www/wwwrunscript.php on line 5

            Warning: fopen(): SAFE MODE Restriction in effect. The script whose uid is 30 is not allowed to access /home/test.ch/ftp/www owned by uid 20191 in /home/test.ch/ftp/www/wwwrunscript.php on line 6

            Warning: fopen(test.txt): failed to open stream: No such file or directory in /home/test.ch/ftp/www/wwwrunscript.php on line 6

            Warning: fclose(): supplied argument is not a valid stream resource in /home/test.ch/ftp/www/wwwrunscript.php on line 6

            Fazit: Weder Verzeichnis noch Datei konnte angelegt werden. Jetzt
               kommt jedoch nicht mehr "Permission denied" (wie beim Test von
               gestern, s. anderes Posting), sondern "SAFE MODE Restriction in
               effect".

            Hm. Ich werde nochmals einen anderen Test durchführen und komme
            dann nochmals auch euch/dich zu... :-)

            Viele Grüsse

            Philipp

            --
            The only program that runs perfectly every time, is a virus.
          3. Halihallo Tom

            beschreib nochmal in kleinen Schritten, was Du tust und was wann die
              Fehlermeldungen sind

            Und die nächste Serie:

            1. Script t.php über FTP hochladen:

            <?
              ini_set('display_errors',true);
              ini_set('error_reporting', E_ALL);

            mkdir('test12', 0755);          // line 5, OK
              mkdir('test12/test123', 0755);  // line 6, SAFE MODE Restr. in ef..
            ?>

            Das Script liegt jetzt unter /home/test.ch/ftp/www/t.php

            Die Permissions von www sind immer noch auf 0777 gesetzt, sodass
            Verzeichnisse und Dateien trotz anderer uid geschreiben werden
            können.

            Ausgabe beim Starten von t.php über Browser:

            Warning: mkdir(): SAFE MODE Restriction in effect. The script whose uid is 20191 is not allowed to access /home/test.ch/ftp/www/test12 owned by uid 30 in /home/daa.ch/ftp/www/t.php on line 6

            Fazit: Das erste Verzeichnis _wird erfolgreich erstellt_ (falls das
            Parentverzeichnis auf 0777 steht). Beim Versuch ein Unterverzeichnis
            dieses neu (und im selben Script!) erstellten Verzeichnisses
            anzulegen, tritt jedoch die SAFE MODE Restriction in effect
            Fehlermeldung auf.

            2. Ich habe das t.php Script von oben weiter angepasst und die
               Permissions für test12 und test123 auf 0777 erhöht, falls sich
               also die User der beiden Verzeichnisse unterscheiden sollten
               (obwohl sie von ein und demselben Script erstellt wurden...?)
               könnte es vielleicht jetzt funktionieren. Negativ. Trotz
               genügender Permissions (full-access) bleibt die SAFE MODE
               Restriction noch immer bestehen (naja, das ist zumindest logisch,
               es hat ja nichts mit Berechtigungen zu tun, sondern mit
               unterschiedlicher uid).

            Viele Grüsse

            Philipp

            --
            The only program that runs perfectly every time, is a virus.
          4. Halihallo zusammen

            Zusammenfassung:

            Beim Versuch über PHP-Scripts Verzeichnisse oder Dateien anzulegen,
            treten stets Warnmeldungen auf.

            1. Normales PHP-Script über FTP hochgeladen (/www/t.php
               im "Document-Root")

            1.1 Verzeichnis erstellen (/www/test123 z.B.)

            Das Script warnt: "Permission denied". Verzeichnis /www hat die
                Berechtigung 0755.

            Fazit: Das PHP-Script läuft unter einer anderer uid, als
                derjenigen des Verzeichnisses. Das PHP-Script hat also nur
                die Berechtigungen für "everyone" (im gegebenen Falle von 0755,
                also nur Execute und Read, nicht aber Write).

            1.1 Verzeichnis erstellen (/www/test123 z.B.), /www jetzt aber 0777

            Das Script kann nun ein Verzeichnis unter /www erstellen, da auch
               Schreibrecht für "everyone" gesetzt sind. Das Verzeichnis
               /www/test123 ist nun erstellt. Jedoch scheitert der Versuch unter
               diesem Verzeichnis ein weiteres Verzeichnis anzulegen an einer
               SAFE MODE Restriction in Effect: uid stimmen nicht überein.

            2. PHP-Script über PHP-Prozess unter wwwrun erstellen.

            2.1 Verzeichnis erstellen (/www/test123 z.B.)

            /www ist immer noch auf 0777 gesetzt (ansonsten liesse sich die
               neue PHP-Datei (nun als wwwrun) gar nicht erst erstellen).

            Leider bricht hier jedwelcher Versuch ein Verzeichnis zu erstellen
               mit SAFE MODE Restriction: uid stimmen nicht überein ab.

            3. Bemerkungen

            3.1 eigentlich ist es mir zuwieder die Rechte auf 0777 zu erhöhen.
                Zudem bringt mir dies nur etwas, wenn ich eine Datei oder ein
                Verzeichnis erstellen möchte. Beim Versuch ein Unterverzeichnis
                des soeben angelegten Verzeichnisses zu erstellen, bricht PHP
                wieder mit der Warnung ab (s. oben).

            3.2 eigentlich halte ich auch nichts von der Variante über ein PHP-
                Administrationsscript Verzeichnisse zu erstellen (was bei mir
                leider auch nicht funktionierte!), so wie es Tom vorschlägt.
                Ich halte es einfach für ein Unding der Provider. Falls dies
                jedoch die einzige Lösung darstellen sollte, nun ja, dann muss
                ich das eben akzeptieren. Nur: Bei mir funktioniert auch das
                nicht...

            3.3 Gott sei Dank ist das nicht mein Server und somit plagt mich
                dieses Problem nur temporär :-)

            Habt ihr vielleicht noch eine Idee? - Ein Tipp? - Seht ihr einen
            Fehler?

            Viele Grüsse

            Philipp

            --
            The only program that runs perfectly every time, is a virus.