PHP move_upload_file需要权限rwx才能存储文件

时间:2015-06-08 10:11:12

标签: php unix permissions

我使用以下代码上传文件并将文件移至“film_images”文件夹:

$filepath = '../images/film_images/';
echo '<br />Trying to store file at ' . $filepath;
if (!move_uploaded_file(
    $_FILES['teaserimage']['tmp_name'],
    sprintf($filepath . '%s.%s',
    'test',
    $ext))) {
        throw new RuntimeException('Failed to move uploaded file.');
}

但是,这里有很多人,我总是有一个

  

无法打开流:权限被拒绝

PHP中的

异常。然后我去了服务器,并使用setfacl命令向用户rw-提供了权限www-data,这是运行此PHP脚本的用户。使用rw-我仍然有例外。只有当我将权限切换到rwx时,即当我对此文件夹进行www-data完全控制时,它才有效。现在我想知道两件事:

  1. 为什么有必要为用户提供执行权限才能写入文件?
  2. 有没有办法编写文件而不给用户执行权限?我担心有人可能会上传隐藏在图像文件中的代码,并在我的服务器上执行它。

2 个答案:

答案 0 :(得分:1)

如果要创建新文件,您需要在文件夹上设置默认权限,首先是chmod:chmod g+s images/film_images //set permission what you need

第二,您需要在创建文件/文件夹上设置默认权限:

setfacl -R -d -m group:www-data:rwx /path/to/your/dir //set permission what you need

答案 1 :(得分:1)

好的,我想我明白了。感谢Paulius S.和他的回答,这让我走上正轨。

该文件夹归我所有。首先,按照this post的答案,我使用

chmod g+rwxs dirname

确保目录中创建的文件归我所属的组所有。特别是,www-data不属于该组。然后使用

setfacl -m u:www-data:rwx dirname

我完全访问用户www-data的目录。现在www-data可以上传一个,但是这个文件自动属于上面设置的组(www-data不属于),因此www-data没有执行权,尽管他一般可以在文件夹中执行。