【问题标题】:file_put_contents permission denied -- any solution without 777?file_put_contents 权限被拒绝——没有 777 的任何解决方案?
【发布时间】:2014-09-13 03:19:42
【问题描述】:

我正在开发一个用户可以使用表单上传图像/视频的页面。代码包括这一行:

move_uploaded_file($tempfile, $newfile)

然后从这个图像/视频自动创建一个缩略图并上传到服务器,如下所示:

file_put_contents($thumbname, $thumbnail)

现在图片的上传工作完美,但缩略图无法保存,我收到了以下回复:

警告:file_put_contents(thumbnails/1.jpg):未能 打开流:权限被拒绝 第 17 行的 SITEURL/upload.php

我的两个问题:

  1. 为什么用户有权通过move_uplaoded_file 上传图片,但通过file_put_contents 上传缩略图却被拒绝?请注意,图像和缩略图这两个文件都会上传到同一个文件夹。用户不应该有两者都做的权限还是两者都不做?

  2. 我确实意识到已经有一个这样的线程,但建议的答案是运行chmod 777。但我读到将文件夹设置为 777总是存在安全风险。没有 777 有没有办法解决这个问题?
    同样,我不明白为什么我必须将file_put_contents 的权限更改为 777,而 move_uploaded_file 在 755 上工作得很好。

【问题讨论】:

  • chmod -R u+rwx,g-rw,o-x thumbnails/ 为所有者提供读、写和执行权限,但拒绝组和其他人的执行权限。 chmod 足够强大到manage rights more carefully。比 777 更仔细,这是肯定的
  • @EliasVanOotegem 这不是chmod -R 766 的简写吗?
  • @NiettheDarkAbsol:是的,但我发现 u+rwxg-wx 符号更清晰:_U_ser, _G_roup, _O_ther, _A_ll, + for grant, - for否认和_R_ead,_W_rite,e_X_ecute...(当然,你知道这一点,但这个解释是针对OP的;-P)
  • @NiettheDarkAbsol:对于每个人来说,只要我们都同意最好避免chmod -R 777,这一切都很好
  • @EliasVanOotegem 同意。 chmod -R 777eval 一样“解决问题”...

标签: php file-permissions user-permissions


【解决方案1】:

用途:

// PHP code:
echo `whoami`;

找出运行 PHP 的用户。

然后检查拥有thumbnails的服务器

# log in via SSH and run:
ls -l | grep thumbnails

这应该向您显示这样的一行(取自我自己的服务器):

drwxr-xr-x 8 niet niet 4096 Jul 15 12:12 thumbnails

在上面的示例中,该文件夹由用户 niet 拥有,并且在组 niet 中。如果它与来自 ealier 的 whoami 不同,则需要更改文件夹的所有者。例如,如果whoami 给了user3041398,你会这样做:

chown user3041398 thumbnails

再次运行ls 行,您现在应该会在输出中看到您的用户名,PHP 应该能够写入该文件夹。

【讨论】:

  • PHP 代码给了我“www-data”,所以我将缩略图的用户从 root 更改为“www-data”。它奏效了!非常感谢!!
  • @user3041398 很高兴我能帮上忙 :) 请考虑接受这个答案 ^_^