Permission denied bei move_uploaded_file

Permission denied bei move_uploaded_file

am 05.09.2006 11:40:52 von Sharky

Hallo,

was für Rechte muss ich setzen, wenn ich bei move_uploaded_file den
Fehler
"failed to open stream: Permission denied" bekomme, gefolgt von "Unable
to move '/tmp/phpHCGSNX' to 'up1157448597.txt'".

Ich rufe es zunächst einfach auf mit:
move_uploaded_file ($_FILES['userfile']['tmp_name'],
'up'.$_POST['ID'].'.txt')

wobei in dem Formular stand und Id
eine Zahl ist.

Danke!

Re: Permission denied bei move_uploaded_file

am 05.09.2006 12:37:46 von Ulf Kadner

Jens Müller wrote:

> was für Rechte muss ich setzen, wenn ich bei move_uploaded_file den Fehler
> "failed to open stream: Permission denied" bekomme, gefolgt von "Unable
> to move '/tmp/phpHCGSNX' to 'up1157448597.txt'".
>
> Ich rufe es zunächst einfach auf mit:
> move_uploaded_file ($_FILES['userfile']['tmp_name'],
> 'up'.$_POST['ID'].'.txt')

Nutz doch einfach erst mal einen absoluten Pfad. Dann siehst Du
wenigstens, falls der Fehler noch bestehent wo Du den nix hinschreiben
darfst. Allerdngs hat das setzen von Rechten mit PHP nix zu tun. Wenn Du
mit der Rechteverwaltung von Linux/Unix nicht klar kommst solltest Du
das in einer passenden NG nachfragen. Aber im normalfall reicht hier
google aus. Es gibt "tausende" Anleitungen dazu.

MfG, Ulf

Re: Permission denied bei move_uploaded_file

am 05.09.2006 13:09:05 von thornythegod

Ulf Kadner schrieb:
> Jens Müller wrote:
>
>> was für Rechte muss ich setzen, wenn ich bei move_uploaded_file den
>> Fehler
>> "failed to open stream: Permission denied" bekomme, gefolgt von
>> "Unable to move '/tmp/phpHCGSNX' to 'up1157448597.txt'".
>>
>> Ich rufe es zunächst einfach auf mit:
>> move_uploaded_file ($_FILES['userfile']['tmp_name'],
>> 'up'.$_POST['ID'].'.txt')
>
> Nutz doch einfach erst mal einen absoluten Pfad. Dann siehst Du
> wenigstens, falls der Fehler noch bestehent wo Du den nix hinschreiben
> darfst. Allerdngs hat das setzen von Rechten mit PHP nix zu tun. Wenn Du
> mit der Rechteverwaltung von Linux/Unix nicht klar kommst solltest Du
> das in einer passenden NG nachfragen. Aber im normalfall reicht hier
> google aus. Es gibt "tausende" Anleitungen dazu.

Ergänzend:
Du solltest über die Verwendung folgender Funktionen nachdenken:
is_dir()
is_file()
file_exist()
is_writable()
is_uploaded_file()

Gruß,
Torsten

Re: Permission denied bei move_uploaded_file

am 05.09.2006 13:47:14 von Sharky

> Nutz doch einfach erst mal einen absoluten Pfad. Dann siehst Du
> wenigstens, falls der Fehler noch bestehent wo Du den nix
> hinschreiben
> darfst.

Ja, das habe ich auch schon versucht:
move_uploaded_file ($_FILES['userfile']['tmp_name'],
'/var/www/vhosts/25/httpdocs/datei.txt')

Gibt den gleichen Fehler.

Der gleiche Code funktioniert auf einem anderen Server aber ohne
Probleme.

> Allerdngs hat das setzen von Rechten mit PHP nix zu tun. Wenn
> Du mit der Rechteverwaltung von Linux/Unix nicht klar kommst solltest
> Du das in einer passenden NG nachfragen. Aber im normalfall reicht
> hier google aus. Es gibt "tausende" Anleitungen dazu.

Nun, da es ein Hosting Server eines Dritten ist, und ich keinen SSH
Zugriff habe, kann ich Dir nicht sagen wie das dort ist. Aber wenn PHP
als Fehlermeldung sagt, Permission denied, müsste das doch so sein?
Also muss irgendjemandem mehr Rechte eingeräumt werden.

Re: Permission denied bei move_uploaded_file

am 05.09.2006 14:24:10 von Ulf Kadner

Jens Müller wrote:

> Ja, das habe ich auch schon versucht:
> move_uploaded_file ($_FILES['userfile']['tmp_name'],
> '/var/www/vhosts/25/httpdocs/datei.txt')

Dann must Du die Rechte über Dein FTP-Programm entsprechend setzen. Ich
nehme an /var/www/vhosts/25/httpdocs ist Dein document_root Verzeichnis.
Wenn dem so ist, dann solltest Du keine Probleme haben beim setzen der
Rechte über FTP. Wenn es nicht geht, dann rufe Deinen Hoster an und sage
Ihm er soll die Rechtevergabe reparieren bzw. Dir sagen warum es nicht
möglich ist die Rechte in Deinem eigenen Verzeichnis zu ändern.

Aber das ganze hat halt nix mit PHP zu tun. PHP sagt halt nur was nicht
geht.

MfG, Ulf

Re: Permission denied bei move_uploaded_file

am 05.09.2006 14:42:42 von Sharky

>> Ja, das habe ich auch schon versucht:
>> move_uploaded_file ($_FILES['userfile']['tmp_name'],
>> '/var/www/vhosts/25/httpdocs/datei.txt')
>
> Dann must Du die Rechte über Dein FTP-Programm entsprechend setzen.
> Ich nehme an /var/www/vhosts/25/httpdocs ist Dein document_root
> Verzeichnis. Wenn dem so ist, dann solltest Du keine Probleme haben
> beim setzen der Rechte über FTP.

Ok, habe zum Testen erst einmal die Rechte eines neues Vereichnisses
auf 777 gesetzt.

Nun kommt:
SAFE MODE Restriction in effect. The script whose uid is 10003 is not
allowed to access / owned by uid 0

Worauf bezieht sich das nun wieder?

Grüße,
Jens

Re: Permission denied bei move_uploaded_file

am 05.09.2006 15:07:57 von Joerg Behrens

Jens Müller schrieb:
>
>>> Ja, das habe ich auch schon versucht:
>>> move_uploaded_file ($_FILES['userfile']['tmp_name'],
>>> '/var/www/vhosts/25/httpdocs/datei.txt')
>>
>> Dann must Du die Rechte über Dein FTP-Programm entsprechend setzen.
>> Ich nehme an /var/www/vhosts/25/httpdocs ist Dein document_root
>> Verzeichnis. Wenn dem so ist, dann solltest Du keine Probleme haben
>> beim setzen der Rechte über FTP.
>
> Ok, habe zum Testen erst einmal die Rechte eines neues Vereichnisses auf
> 777 gesetzt.
>
> Nun kommt:
> SAFE MODE Restriction in effect. The script whose uid is 10003 is not
> allowed to access / owned by uid 0

Also '/' deutet nun darauf hin das du deine Datei in der Wurzel des
Filesystems ablegen willst. Logisch das dies nicht geht bzw. dir
hinterher nicht hilft. Baue das Zielverzeichnis mit Hilfe der Variable
$_SERVER['DOCUMENT_ROOT'] + /meinverz + /dateiname Zusammen.

Solltest du dann immer noch Safe_mode Warnings bekommen und dein Hoster
verwendet mod_php anstelle von CGI/FCGI dann gibs nur wenig Rettung. Die
Funktion move_uploaded_file() sollte zwar Safe_mode ignorieren
allerdings kannst du dann die Datei mit keiner anderen PHP Funktion mehr
anlangen da die Datei mit den Rechten des Webservers erstell wurde dein
PHP Script aber deinem FTP User gehoert. Ergo sind die UID
unterschiedlich und der safe_mode schlaegt an.

12.2. Was genau bewirkt safe_mode und ist das sicher?
http://faq-php.de/q/q-konfiguration-safe-mode.html

Gruss
Joerg

--
TakeNet GmbH http://www.takenet.de
97080 Wuerzburg Tel: +49 931 903-2243
Alfred-Nobel-Straße 20 Fax: +49 931 903-3025

Re: Permission denied bei move_uploaded_file

am 05.09.2006 15:51:23 von Sharky

>> Nun kommt:
>> SAFE MODE Restriction in effect. The script whose uid is 10003 is
>> not
>> allowed to access / owned by uid 0
>
> Also '/' deutet nun darauf hin das du deine Datei in der Wurzel des
> Filesystems ablegen willst. Logisch das dies nicht geht bzw. dir
> hinterher nicht hilft.

Das kommt wohl, weil ich versucht hatte, einen absoluten Pfad mit /
anzugeben, wobei ich / als '/var/www/vhosts/25/' interpretierte, so wie
es beim FTP Zugriff auch ist. In dem Fall ist aber / wohl wirklich /.

Baue das Zielverzeichnis mit Hilfe der Variable
> $_SERVER['DOCUMENT_ROOT'] + /meinverz + /dateiname Zusammen.

Ich habe nun Zugriff auf '/var/www/vhosts/25/private' erhalten, das
liegt nicht unterhalb von document root (die hochgeladenen Dateien
sollen da hin kommen und so auch nicht von außen zugreifbar sein).
Das Private Verzeichnis hat nun 777 Rechte.
Wenn ich dieses mit abolutem Pfad als Ziel für move_uploaded_file
angebe, ist nun wieder eine Einschränkung aktiv:
open_basedir restriction in effect.
File(/var/www/vhosts/25/private/test.txt) is not within the allowed
path(s): (/var/www/vhosts/25/httpdocs:/tmp)

Warum darf ich nichts außerhalb von htdocs hochladen, und wie kann ich
dieses Verzeichnis zu den erlaubten Pfaden hinzufügen?

Grüße,
Jens

Re: Permission denied bei move_uploaded_file

am 05.09.2006 16:37:47 von Ulf Kadner

Jens Müller wrote:

> Das kommt wohl, weil ich versucht hatte, einen absoluten Pfad mit /
> anzugeben, wobei ich / als '/var/www/vhosts/25/' interpretierte, so wie
> es beim FTP Zugriff auch ist.

Eieieiei... :-)

/ bezieht sich auf die Verzeichnisstruktur. / bezieht sich nur dann auf
document_root wenn Du es über http aufrufst.

> Wenn ich dieses mit abolutem Pfad als Ziel für move_uploaded_file
> angebe, ist nun wieder eine Einschränkung aktiv:
> open_basedir restriction in effect.
> File(/var/www/vhosts/25/private/test.txt) is not within the allowed
> path(s): (/var/www/vhosts/25/httpdocs:/tmp)
>
> Warum darf ich nichts außerhalb von htdocs hochladen,

Weil das Dein Webhoster so festgelegt hat. :-) Da kannst nix dran
aendern. Max. mal den Hoster fragen. Aber da brauchste schon nen
plausiblen Grund dafuer. Legs doch einfach in einen Verzeichnis ab
welches über den Webserver nicht von aussen erreichbar ist.

Also z.B.:

- Verzeichnis '/var/www/vhosts/25/httpdocs/geheim' erstellen
- .htaccess-Datei in dem Verzeichnis mit folgenden Inhalt erstellen:
deny from all

MfG, Ulf

Re: Permission denied bei move_uploaded_file

am 05.09.2006 17:34:16 von dev-null-use-reply-adress

Jens Müller schrieb:

> Ich habe nun Zugriff auf '/var/www/vhosts/25/private' erhalten, das
> liegt nicht unterhalb von document root (die hochgeladenen Dateien
> sollen da hin kommen und so auch nicht von außen zugreifbar sein).
> Das Private Verzeichnis hat nun 777 Rechte.
> Wenn ich dieses mit abolutem Pfad als Ziel für move_uploaded_file
> angebe, ist nun wieder eine Einschränkung aktiv:
> open_basedir restriction in effect.
> File(/var/www/vhosts/25/private/test.txt) is not within the allowed
> path(s): (/var/www/vhosts/25/httpdocs:/tmp)

Das ist jetzt aber wirklich ein Versäumnis des Hosters.
Wenn er schon so freundlich ist, seinen Kunden noch eine
Verzeichnisebene über dem document_root anzubieten, so sollte
er auch gefälligst open_basedir entsprechend setzen.

Der Pfad zu PEAR fehlt dort IMHO auch noch.


Gruß
JPM

Re: Permission denied bei move_uploaded_file

am 05.09.2006 17:45:41 von Sharky

> Weil das Dein Webhoster so festgelegt hat. :-) Da kannst nix dran
> aendern. Max. mal den Hoster fragen. Aber da brauchste schon nen
> plausiblen Grund dafuer. Legs doch einfach in einen Verzeichnis ab
> welches über den Webserver nicht von aussen erreichbar ist.

Ja gut, mit htaccess muss ich es dann wohl machen, auch wenn ungerne.

Jens