SAFE MODE Restriction bei "verschachteltem"mkdir
Philipp Hasenfratz
- php
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
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
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
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
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
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
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
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
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