Datei in einem gerade erstellten Ordner speichern?
Paul
- php
Hallo zusammen,
ich habe schonmal gepostet, das Thema ist leider inzwischen in die SELFHTML Zwischenwelt verschwunden. Ich habe aber den Fehler eingrenzen können. Mein Problem ist der Safemode. Ich erstelle einen Ordner und möchte in diesen eine Datei verschieben. Der Safe Mode springt an. Speichere ich die Datei nicht in dem gerade erstellten Ordner sondern z.B. im Überordner sind alle Probleme weg. Ich erhalte folgende Fehlermeldung:
Warning: copy(): SAFE MODE Restriction in effect. The script whose uid is 894 is not allowed to access /absoluterpfad/fotos/041111sdf89217 owned by uid 33 in /absoluterpfad/fotos/upload3.php on line 19
Warning: copy(/absoluterpfad/fotos/041111sdf89217/hochladentest.): failed to open stream: No such file or directory in /absoluterpfad/fotos/upload3.php on line 19
Das Skript dazu:
$name .= $_FILES['file']['name'];
$verzeichnispfad = "../../fotos/".$neuesverzeichnis;
$pfad = "/absoluterpfad/".$name;
if (empty($error))
{
if (!(mkdir ($verzeichnispfad, 0700)))
{
$error[] = "Verzeichniserstellung fehlgeschlagen!<br>";
}
}
if (empty($error))
{
if (!(chmod ($verzeichnispfad, 0777)))
{
$error[] = "Rechte freibiegen fehlgeschlagen!<br>";
}
}
if (empty($error))
{
if (!($c = copy($tempname, $pfad)))
{
$error[] = "Fehler beim Speichern der Datei!<br>";
}
}
if (empty($error))
{
if (!(chmod ($verzeichnisneu, 0644)))
{
$error[] = "Rechte zurueckbiegen fehlgeschlagen!<br>";
}
}
Das ist hier nur ein Auszug und soll verdeutlichen, was ich machen möchte. Die Pfadangaben habe ich etwas abgeändert, sie stimmen aber alle im echten Skript. Wie gesagt, gebe ich als Speicherpfad nicht den neu erstellten an, sondern einen, den ich per FTP angelegt habe, paßt alles. Sobald ich aber in das gerade erstellte Verzeichnis rein will, springt der Safe_Mode an. Gibt es eine Möglichkeit, diese Problem zu umgehen? Es muß doch möglich sein, einen Ordner zu erstellen und da rein Dateien hochzuladen... Hat einer ähnliche Prolbeme gehabt? Wäre für jede Hilfe dankbar.
Gruß, Paul.
PS: Ich denke kaum, daß sich der Provider darauf einläßt, den Safe-Mode abzuschalten.
Hello,
beim safe_mode und safe_mode_gid ist im wesentlichen von Interesse, wem die Scripte, Dateien und Verzeichnisse gehören.
Wenn das Script dem User gehört, weil er es hochgeladen hat, dann gehört das Verzeichnis, das er mittels dieses Scripts anlegt trotzdem dem Webserver.
Der Webserver darf dann mit dem Script anschließend nicht mehr auf das von ihm gerade angelegte Verzeichnis zugreifen.
Du müsstest also entweder das Script dem Webserver übereignen. Das chown-Kommando darf aber nur root benutzen. Oder Du müsstest die Datei als User anlegen. Ddas geht dann natürlich nicht mittels PHP-Script.
Die Provider richten gerne die Server mit dem Safe_mode ein. Der Beschreibung nach weiß ich aber nicht, wie man das System dann jemals zum Laufen bringen soll. Besser ist die Verwendung von Open_Base_Dir. Das sollte für jede Domain auf die "Domainroot" der Domain eingerichtet sein. Die sollte sich dann aufteilen in "scripts", "includes" und in "http-root", also Document-Root. Außerdem sollten die Pfade für die include-Dateien und ein Verzeichnis für safe_mode_exec_dir gesetzt sein.
Workaround und einzige Lücke:
Schreib Dir ein Upload-Script für Deine Scripte. Alle mittels dieses Scriptes hochgeladenen Scripte sind dann Eigentum des Webservers und liegen erstmal in einem Verzeichnis, dass Dir gehört. Wenn Du nun mittels eines weiteren dir gehörenden Scriptes ein Unterverzeichnis zu Deinem anlegst, dann gehört das dem Webserver. Mit den Scripten, die Du mittels des Uploadscriptes hochgeladen hast, kannst Du nun darauf zugreifen.
Besser wäre es wie gesagt, wenn entweder Safe_Mode_GID auch eingeschaltet wäre und dazu open_base_dir benutzt würde.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hallo Tom,
vielen Dank für Deine Erläuterungen. Ich mußte sie mir zwar mehrmals durchlesen, bis ich sie verstanden habe, aber Du hast mir endlich mal erklärt, warum ich das Problem habe. (das mit dem mehrmals durchlesen müssen liegt nicht an Dir - Deine Erklärungen waren sehr gut - sondern an meinen fehlenden Kenntnissen auf diesem Gebiet und der fortgeschrittenen Stunde...) Also danke schonmal. Das bringt mich echt weiter.
Ich hoffe, ich hab das jetzt richtig verstanden. Ich lade also das Skript, welches mir das Verzeichnis erstellt, in das später die Bilder kommen, selbst mit einem Skript hoch anstatt es per FTP hochzuschieben und schwupps, sind alle meine Probleme gelöst. Hmmm, das ist eine pragmatische Lösung.
Ich möchte ja nicht an den UNIX Entwicklern zweifeln, aber steckt dahinter auch ein tieferer Sinn? Nungut. Ich werd mal weiter basteln und die Lösung probieren.
Viele nächtliche Grüße, Paul
Hello,
Ich möchte ja nicht an den UNIX Entwicklern zweifeln, aber steckt dahinter auch ein tieferer Sinn? Nungut. Ich werd mal weiter basteln und die Lösung probieren.
Die Unix-Entwickler haben daran wenig Schuld. Es ist die mangelde Erfahrung mancher Provider. Entweder man gibt seinen Usern Root-Shells, sodass sie sich innerhalb ihres Bereiches so austoben können, als wären sie root, oder man konfiguriert PHP vernünftig oder man stellt eine Toolbox zur verfügung, so wie es die Telekom macht (gemacht hat?).
Allerdings gibt es für Unix/Linux inzwischen NDS für Linux. da kann man dann diese ganze Objektrechte auch einstellen. Das kostet natürlich, ist aber seeehr praktisch.
Liebe Grüße aus http://www.braunschweig.de
Tom