授予PHP写入文件和文件夹的权限


13

为进一步清晰度而更新:

根据http://expressionengine.com/user_guide/installation/installation.html,它表示:

对于大多数Unix主机,以下是典型的情况,但您可以与主机进行检查,以确定是否可以使用更多限制性权限来允许PHP写入文件(666)和文件夹(777)。在Windows服务器上,以下内容将不适用,但是您需要确保文件和文件夹可由ExpressionEngine写入。您可能需要为此联系您的房东。

不知道这意味着什么。我可以将特定的文件和文件夹分别更改为666和777,但是上面的声音听起来像我也需要允许PHP执行此操作?

原始问题:

我需要确保PHP可以写入特定文件(666)和文件夹(777)。

我该怎么做呢?


2
我不确定您要解决什么问题?如果您可以访问文件所在的目录并具有执行权限,则可以使用这些权限写入文件和目录。
卡森(Karlson)2012年

在上面添加了更多详细信息。
oshirowanen 2012年

1
对于大多数Unix主机,以下是典型的情况,但您可以与主机进行检查,以确定是否可以使用更多限制性权限来允许PHP写入文件(666)和文件夹(777) -是否缺少逗号?否则,这句话没有任何意义。除非更高级别的目录受到限制,否则写入世界可写文件或目录没有问题。
Karlson '04年

我只是从文档中进行了复制和粘贴。另外,这就是为什么我发布问题的原因,因为我不明白该报价的意思是什么
oshirowanen 2012年

1
如果您看到文档建议您将666或777用于Web文件,则除非有充分的理由说明,否则您应该忽略它。通常是某些人写的东西,他们不知道如何设置正确的权限,却放弃了,让所有人都可以读取或写入文件。
jsbillings 2012年

Answers:


18

我将通过技术解决方案来完善rahmu和MV的答案。后面的所有内容仅对类似UNIX的系统有效。

滚动到chmod / chown部分,以获取使用ACL的示例-比UNIX文件模式更强大的工具。

查找您的Web服务器用户名

首先,您需要知道您的Web服务器运行所使用的用户名。如果您使用的是Apache,它可以是apachehttpdwww-data等等。在大多数的Debian类系统中,Apache是www-data。对于nginx,通常也是如此www-data

要查看它,请尝试:

ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1

确保此命令返回的用户名是一致的(例如,我99%的时间使用nginx,但是此命令返回的tomcat7是我安装一次的Java Web服务器)


授予Web服务器权限:使用chmodchown

使用chmod666或777(解决不良文档/教程中此类问题的理想解决方案)可以神奇地使事情正常进行,但并不安全。授予666或777权限将授予“其他”访问权限。所以,不只是Apache的,也grandmothernsa(前提是您的计算机上存在这些用户帐户-但没有真的,请避免这样做,除非它只是用于测试/故障排除)。

最好是更加具体,并只授予您和Apache权限。更改文件组,以将对文件的完全控制权提供给Web服务器。为此,请递归更改所有者:

chown -R www-data:www-data your/folder/

但是最有可能的是,您可能只想通过更改组来保持对文件的完全访问权限:

chown -R yourusername:www-data your/folder/

然后,执行适当的操作chmod以赋予该组www-data与您相同的权限。例如,如果当前模式为640 (您的模式为6,www-data的模式为4,其他模式的0,转换为-rw-r -----),则将其设置为660 (您的模式为6,www-data的模式为6)。数据,其他则为0,转换为-rw-rw ----)。请参阅rahmu的答案以了解有关文件模式的更多信息,这是一个古老而优雅的机制。

为了避免使用操纵奥术数chmod,您还可以使用以下语法:

chmod -R g+rw your/folder/

这意味着“向组(g),递归()添加(+rw对文件夹的读写权限your/folder/-R)”。

在90%的情况下,这应该足够了。


我的首选方法:使用ACL(访问控制列表)

有时第一个解决方案是不够的。我将以Symfony框架为例,该框架记录和缓存大量数据。因此,它需要对相应文件夹的写权限。

当同时在CLI(使用我的用户帐户)和Web(Web服务器用户)中使用Symfony控制台时,chmod/ chown方法可能还不够。这会导致很多问题,因为Symfony会不断修改权限。

在这种情况下,我们将使用ACL(访问控制列表),这是在许多UNIX系统上管理权限的更高级的方法。

这里由官方的Symfony文档中给定(命令,请更改app/cacheapp/logs您的需要):

在支持的系统上chmod +a(即不支持Debian / Ubuntu)

sudo chmod +a "www-data allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs
sudo chmod +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs

在不支持的系统上chmod +a(最常见)

您将需要该setfacl工具;也许默认情况下它已安装在您的系统上,所以请尝试setfacl -v查看该命令是否可用。

如果命令不可用,并且您正在使用Ubuntu 14.04+,则只需安装该工具:

sudo apt install acl

否则,请遵循您的OS文档,因为您可能需要更改分区的挂载方式(此处Ubuntu文档)。

我们到了:

sudo setfacl  -R -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs
sudo setfacl -dR -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs

我从来没有过这种方法的任何问题,满意或您的钱。


1
为“ ps aux +1” | grep -E'[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx'| grep -v根| 头-1 | 切-d \ -f1'
阿马尔普拉塔普

4

无论文件的所有者是谁,666的权限和777都足够:最后一位数字确保系统上的每个用户都可以访问。尽管这是最简单的方法,但出于确切的原因,它绝对不是最安全的方法。

一种更好的方法

您需要了解的第一件事是Unix权限如何工作。为了理解我在此链接中给出的答案,请注意,可以将权限转换为数字:

  • 0: ---
  • 1: --x
  • 2: -w-
  • 3: -wx
  • 4: r--
  • 5: r-x
  • 6: rw-
  • 7: rwx

chmod 666然后,A 等效于将权限更改为rw-rw-rw

接下来,您必须确定哪个用户正在执行PHP脚本。通常,这将是运行您的Web服务器的用户。这是如何执行此操作的示例(您可以将Apache替换为Web服务器的名称)。

一旦知道哪个用户执行脚本,哪个是您提到的文件的所有者,就由您来设置适当的权限。请记住,为系统上的每个用户提供写访问(甚至读)可能会造成灾难性的后果。


0

表达式引擎就像许多其他PHP Web应用程序一样,需要对某些文件和目录进行读写访问。例如,EE要求对其config.php和database.php文件具有写访问权,并且对其文件上载目录具有写访问权。

该文档说明的是,由于大多数服务器都以mod_php的身份运行PHP(并因此在Web服务器的权限下运行),并且您可能会使用自己的用户使用FTP(或类似文件)上传文件,因此这些文件和目录将需要被授予权限666(每个人都可以读取和写入)和777(每个人都可以读取,写入和浏览)。

那不是最安全的方法,但肯定是最简单的方法,特别是如果您使用的是托管服务。

但是,如EE指示所述,请咨询您的托管服务提供商,因为有些提供商不使用mod_php,而是使用fastcgi,suhp或其他版本。这些服务器以您自己的用户身份运行PHP,因此您上传的所有文件已经可以被PHP和EE脚本创建的任何文件读取和写入。在这种情况下,需要为PHP访问的文件和目录提供600和700的访问权限。通过Web服务器直接访问的其他文件(而不是PHP运行时)仍需要666和777访问权限。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.