【问题标题】:fopen can't create filefopen 无法创建文件
【发布时间】:2014-06-27 09:19:14
【问题描述】:

我正在做一些需要 PHP 来制作文件和文件夹的东西。我正在使用fopen 创建文件。但是,它似乎不起作用。当我编写代码时,我在带有 WAMP 的 Windows 上,一切正常,但是当我将站点移动到 Ubuntu 服务器时,脚本根本不起作用。

这是我用于创建文件和压缩的代码

mkdir($sessionid, 777);

// create the server.properties
$server_config = fopen("$sessionid/server.properties",'a');
$config = "test";
fwrite($server_config,$config);
fclose($server_config);

// create the run.sh/bat
$server_script = fopen("$sessionid/RUN.$platform", 'a');
fwrite($server_script,$script);
fclose($server_script);

// zip them all together
$zip = new ZipArchive();

$ow = 1;
$file= "$sessionid/RFSLABSserver.zip";
if($zip->open($file,$ow?ZIPARCHIVE::OVERWRITE:ZIPARCHIVE::CREATE)===TRUE)
{
    // Add the files to the .zip file
    $zip->addFile("/$sessionid/server.properties", "server.properties");   
    $zip->addFIle("/$sessionid/RUN.$platform", "Start.$platform");
    // file source as file name

    $zip->close();
}

脚本的作用是创建一个带有随机数 sessionid 的文件夹,并在该文件夹内创建 2 个文件并压缩它们。注意文件夹是创建的,而不是里面的文件

【问题讨论】:

  • 你不应该为一个简单的 web 应用程序设置 777 权限。

标签: php fopen


【解决方案1】:

你的脚本有这个:

mkdir($sessionid, 777);

但应该是这样的;注意777前面的0

mkdir($sessionid, 0777);

也就是说,您应该阅读 PHP 和 Unix 权限here。一般来说,您的权限应该永远出于任何原因设置为777

当您将权限设置为 777 时,这意味着 100% 可以在任何级别访问您的计算机的任何人都可以 readwriteexecute 文件。这意味着如果您的网站被黑客入侵,那么黑客就会使用执行权限来启动脚本以深入了解您的系统。或者系统上的其他人(因为他们可以readwriteexecute 文件)可以在您不知情的情况下简单地删除您的文件。

您应该查看谁是您尝试在其中创建$sessionid 的目录的所有者。文件或目录/文件夹的所有者是解决此类问题的关键。那么chmod权限需要符合文件所有者的需要。

您尝试执行此操作的父目录的所有者应与 Apache Web 服务器用户相同,在现代系统上通常为 www-data。因此,您尝试在其中创建$sessionid 文件的父文件夹应归www-data 所有,并具有readwriteexecute 权限集,相当于7

一旦你设置了所有者问题,一个更安全、理智和实际的做法是将父文件夹的权限设置为755,并将你的mkdir设置为0755,如下所示:

mkdir($sessionid, 0755);

将目录设置为755 并将文件设置为644 是最好的方法,只要文件的所有权是可靠且正确的。 644权限基本分解如下

  • 第一个6 表示文件的所有者可以read & write 访问它。
  • 下一个4 表示连接到该文件的组成员只能read 它。
  • 下一个4 表示其他人(既不是组所有者也不是组成员)可以read 它。

至于755,它们最适合目录/文件夹,因为目录/文件夹需要拥有execute 权限才能让您查看其中的内容。所以它像这样分解:

  • 第一个7表示文件的所有者可以readwriteexecute它。
  • 下一个5 表示连接到该目录/文件夹的组成员只能read & execute 它。
  • 下一个5 表示其他人(既不是所有者也不是组成员)只能readexecute 它。

【讨论】:

    【解决方案2】:

    您应该尝试为目录设置适当的权限。

    mkdir($sessionid, 777);
    

    错了,你应该写

    mkdir($sessionid, 0777);
    

    【讨论】:

    • @MeletisFlevarakis 通过将您的文件设置为777,您将为将来出现一系列其他问题打开大门。
    • @JakeGould 据我所知,在我使用过的一些主机上,它需要设置为 777。甚至不能通过脚本设置,必须通过FTP手动设置
    • 为什么?这有什么问题?
    • 不知道。我不是 Linux 专家。但是我有这样的主机,如果它的权限低于 777,我无法在文件夹中创建任何文件
    • 当您将权限设置为 777 时,这意味着 100% 可以在任何级别访问您的计算机的任何人都可以 readwriteexecute 文件。这意味着如果您的网站被黑客入侵,那么黑客就会使用执行权限来启动脚本以深入了解您的系统。或者在共享主机上,任何其他有权访问该主机的人都可以破解您的代码,甚至只是删除文件。详情请阅读我的回答。
    猜你喜欢
    • 2018-01-03
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 2011-02-03
    • 2010-12-17
    相关资源
    最近更新 更多