function.fopen:无法打开流:PHP 中的权限被拒绝

Posted

技术标签:

【中文标题】function.fopen:无法打开流:PHP 中的权限被拒绝【英文标题】:function.fopen: failed to open stream: Permission denied in PHP 【发布时间】:2011-07-12 08:08:45 【问题描述】:

我正在尝试从我的 php 应用程序为我的网站创建 XML 站点地图。这个想法是创建一个新文件或覆盖现有文件。当我调用 fopen 时,我收到以下错误:

[function.fopen]: failed to open stream: Permission denied

我正在尝试写入webroot,它的权限是:755。这意味着所有者有写权限,对吧?我需要做什么才能使我的脚本能够写入此文件夹? 777会是一件坏事,对吧?我可以以某种方式以所有者身份运行我的脚本吗?

谢谢。

【问题讨论】:

需要更多关于平台的信息。 它正在运行 LAMP。您需要什么信息? 请告诉我它并没有尝试将文件写入它正在执行代码的同一棵树中。 @Ignacio:Linux 2.6.9-89.35.1.EL #1 2011 年 1 月 18 日星期二 17:34:23 EST i686 @staticsan - 不,它不在网络根目录中执行。 【参考方案1】:

777 很正常,因为 PHP 不是以你的身份运行的,它以 PHP 用户、Apache 等身份运行。事实上,你的虚拟主机应该有更高的权限集,以防止其他用户写入/删除你的文件.

【讨论】:

0777 不正常。永远都不应该让其他人拥有写权限。 这实际上取决于您的主机、操作系统、apache 配置和设置。但是,老实说,我发现这样做没有问题,并且已经进行了广泛的渗透测试。真的,只要你的主人做他们应该做的,这不是问题。但是你说的对,775应该绰绰有余了。【参考方案2】:

是的,正如您所说,使用 777 可能是一个巨大的错误。网络服务器与您用于创建文件和文件夹的用户不同。

你有一些选择:

以 cronjob 的形式运行站点地图创建,使用具有写入权限的用户(而不是 apache 用户)。 将站点地图放在另一个目录中,并设置302 Redirect 或符号链接。在这种情况下,如果你有一个安全问题让我们写你的sitemap.xml,至少他们将无法创建另一个具有更危险扩展名的文件(如 PHP,这可能会导致站点入侵)。 制定重写规则,将任何命中重定向到 sitemap.xml,到输出适当 XML 的 php 脚本。

祝你好运!

【讨论】:

【参考方案3】:

它是否适用于启用组写入(即 775)? 检查文件所在目录的组权限。只要您的 PHP 用户(通常是 www-data)是该组的一部分,并且它是唯一的用户,您应该可以使用 775(甚至 774)。

【讨论】:

【参考方案4】:

如果您在 webroot 分区上启用了 ACL,只需授予 web 服务器用户名完全权限

setfacl -m u:apache:rwx /var/www/html

apache 替换为 Web 服务器用户名,将 /var/www/html 替换为您的 webroot 位置。

【讨论】:

【参考方案5】:

我是初学者,我也遇到过这个问题。我正在使用带有 php 和 apache 的 Ubuntu linux

编写一个带有以下内容的 php 脚本:<?php exec('whoami'); ?> 并在您的服务器上运行它。这会告诉您脚本的当前用户是谁 SSH 到您的服务器。 创建一个对您需要的文件具有读写权限的组。 使组对您需要的文件夹具有读取、写入和执行权限。 使您在第一步中找到的当前用户成为可以访问您需要的文件的组的一部分。 重启 Apache:sudo apachectl restart

您需要的主要命令是:

groupadd:创建一个新组 usermod:将您的用户添加到新组 chgrp:将文件/文件夹更改为您指定的组 chmod:更改您指定的文件/文件夹的权限。 您需要的所有命令都在这里:http://www.yolinux.com/TUTORIALS/LinuxTutorialManagingGroups.html

【讨论】:

【参考方案6】:

遇到同样的问题

看起来 apache 在 nobody 组中以 nobody 身份运行

所以如果你做一个

useradd -G nobody youruser

chown -R youruser:nobody .

然后把权限改成0775

chmod -R 0775 .

或者您可以将任何人添加到您的用户组中

useradd -G nobody yourgroup

这是一个更好的解决方案

【讨论】:

【参考方案7】:

就像帕斯卡说的! 只需找到您的 apache 用户

<?php exec'whoami'; ?>

然后

useradd -G username username2
chown -R username:username2 .
chmod -R 0775 .

它完成了! 谢谢帕斯卡!

【讨论】:

以上是关于function.fopen:无法打开流:PHP 中的权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

php中的错误处理机制

php require($file) : 无法打开流

PHP - 无法打开流:没有这样的主机是已知的

要求(供应商/autoload.php):无法打开流

PHP 警告:未知:无法打开流

PHP - SoapClient::SoapClient 无法打开流:连接被拒绝