我有一个 PHP 脚本,它在我的服务器上创建一个文件夹。该文件夹应该通过 Apache 访问,用户可以在线查看它。
现在,如果我以 root 身份创建此文件夹,一切都会正常工作,我可以在访问网站时查看 html/php。
如果我以 Apache 用户身份(或运行我的脚本)创建此文件夹,我可以创建该文件夹并将所有文件放入其中,但是当我进入我的网页时,它会显示:
You don't have permission to access / on this server.
现在我对 Apache 了解不多,但对我来说最简单的解决方案是将文件夹的所有权授予 root。我尝试输入:
chown root:root /blabla/myfolder
其中写道:
chown: changing ownership of 'myfolder/': Operation not permitted
这是为什么 ?
谢谢
答案1
您不需要也做不到将文件夹的所有者和组更改为 root。但是,您可以使用以下命令授予组和其他人的读取权限:
chmod go+r foldername
例子:
yvaine:~ rilindo$ ls -la | grep test
drw------- 2 rilindo staff 68 Dec 5 01:10 test
yvaine:~ rilindo$ chmod go+r test
yvaine:~ rilindo$ ls -la | grep test
drw-r--r-- 2 rilindo staff 68 Dec 5 01:10 test
但是,如果它是一个空文件夹,则 Apache 中可能默认禁用目录浏览。在这种情况下,您可以在节中添加或修改某处:
Options +Indexes
请注意,除非有充分的理由,否则最佳做法通常是禁用目录浏览。
答案2
其他人似乎正在回答您的隐含问题“我该如何解决这个问题?”,并且做得很好,所以我想回答您的实际问题“为什么会这样?”。
出于正当理由,禁止所有非 root 用户通过 chown 放弃文件所有权(即将文件所有权转让给其他用户)。请考虑以下序列:
cp /bin/bash ~/naughty
现在,您的主目录中有一份 bash 副本。您拥有它。没什么大不了的。
chmod 4755 ~/naughty
现在您有了一个可由任何人运行的 bash 副本,并且任何运行它的人都将成为您,因为您已在二进制文件上设置了 SUID 位,并且您拥有该文件。不太好。
chown root:root ~/naughty
恭喜,您刚刚 root 了您的系统;您拥有一个 shell 副本,该副本对 root 具有 SUID,并且可以由任何人运行。
放弃文件所有权的坏处还有其他原因,例如,如果任何人都可以创建一个大文件然后将其交给另一个用户,那么这将影响磁盘配额。但最关键的原因是上述原因,而堵住这个漏洞的唯一方法(不去掉 SUID,这是一个好主意但很难做到)是规定非 root 的用户不得将文件交给另一个用户。