|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2007-06-27 14:16 UTC] mueller at intertrend dot de
Description:
------------
move_uploaded_file() does not work if open_basedir is set.
settings in php.ini:
file_uploads = On
upload_tmp_dir = /tmp
settings in httpd.conf:
php_admin_value open_basedir /www/com/servername
tmp-dir and destination-dir are on the same filesystem.
Reproduce code:
---------------
$uploaddir = '/www/com/servername';
$uploadfile = $uploaddir . basename($_FILES['userfile']['tmp_name']);
echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "Possible file upload attack!\n";
}
echo 'Here is some more debugging info:';
print_r($_FILES);
print "</pre>";
Expected result:
----------------
File is valid, and was successfully uploaded.
Actual result:
--------------
Warning: move_uploaded_file() [function.move-uploaded-file]: open_basedir restriction in effect. File(/tmp/php5bwW9n) is not within the allowed path(s): (/www/com/servername) in /www/com/servername/test.php on line 9
Warning: move_uploaded_file(/tmp/php5bwW9n) [function.move-uploaded-file]: failed to open stream: Operation not permitted in /www/com/servername/test.php on line 9
Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/php5bwW9n' to '/www/com/servername/php5bwW9n' in /www/com/servername/test.php on line 9
Possible file upload attack!
Here is some more debugging info:Array
(
[userfile] => Array
(
[name] => Neu Textdokument (2).txt
[type] => text/plain
[tmp_name] => /tmp/php5bwW9n
[error] => 0
[size] => 1500
)
)
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 12:00:01 2025 UTC |
Hi, After some investigation, here's what I've found. move_uploaded_file() makes use of the internal PHP function php_copy_file() when source file and destination file are not on the same filesystem (rename() works only on a single FS). php_copy_file() changed from version 4.4.2 to 4.4.3: # diff -u php-4.4.2/ext/standard/file.c php-4.4.3/ext/standard/file.c [ ... discarded some stuff ...] @@ -2196,7 +2201,7 @@ safe_to_copy: srcstream = php_stream_open_wrapper(src, "rb", - STREAM_DISABLE_OPEN_BASEDIR | REPORT_ERRORS, + ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL); if (!srcstream) I guess the STREAM_DISABLE_OPEN_BASEDIR flag meant "bypass open_basedir". And as that flag is gone... Anyway, even with PHP 4.4.3 and above, if 'upload_tmp_dir' and the destination of move_uploaded_file() are on the same FS, everything works fine as as "rename()" is used (which is not affected by open_basedir restrictions). I "solved" the issue by moving my upload_tmp_dir to the same FS where my websites are stored. Bye, G.