在 PHP mkdir 中使用模式 0664 是个好主意吗?


Is using mode 0664 in PHP mkdir a good idea?

我正在创建一个网站创建服务,用户可以在其中在FTP浏览器界面中上传文件。我也希望他们能够创建真正的目录,但我担心如果他们上传脚本,可能会对服务器造成严重破坏。

我正在使用PHP和mkdir()函数。在创建目录时使用模式0664是一个好主意,以防止:

  1. 恶意文件被执行。
  2. 防止任何人写入或执行这些文件。

这是个好主意吗?

不,在目录上使用0664是没有意义的。

您很可能需要它们上的 X 标志,因为您希望能够获取目录列表。"执行"目录与执行程序没有任何共同之处。禁用目录上的 X 标志不会影响存储在目录中的程序的执行。

您必须确定哪个帐户实际涉及文件访问。此帐户可能是某些文件的所有者,也是这些文件目录的所有者。PHP 所做的任何事情都将以该用户的身份完成。因此,如果您限制组或世界(又名 0700)对文件的访问并不重要。另一方面,您的 FTP 访问可能不是同一个用户,而只是共享一个组。在这种情况下,将此组限制为无法访问文件是一个烦人的想法,因为您无法读取、写入或删除它们。

如果您允许用户使用上传到您的服务器的工具,并且您不能保证这些文件永远不会被执行,您可能不应该提供此服务。使用访问标志不会改善这种情况,因为 PHP 不需要 X 标志,它只需要文件可读。因此,如果FTP站点应该有任何用处,那么能够读取文件是必须的,否则为什么要上传它们?

请注意,通常的FTP上传/下载服务将上传与下载分开。上载是一种单向操作,它将文件放置在服务器上,但不可访问。管理员必须检查上传并将其移动到只读的下载区域中。没有人可以触发任何文件的执行,因为服务器将忽略任何可执行标志,只是将此类文件的字节发回。

如果没有executable权限,您甚至无法打开目录中的文件。但是,您可以在没有read权限的情况下访问目录中的文件。需要read权限才能列出目录内容。

root 之外,无法访问0644目录。

例子

无法:

dir/ = drw-rw-r-- (0644) -- 实际上与d--------- (0000)相同

所以file_get_contents ('dir/file.txt')总是会失败。

可访问,但无法列出:

dir/ = d-wx-wx--x (0331)

因此,如果dir/file.txt存在,file_get_contents ('dir/file.txt')将起作用。但opendir ('dir')不会。

完全无障碍:

dir/ = drwxrwxr-x (0775)

如果存在dir/file.txt file_get_contents ('dir/file.txt')将起作用。opendir ('dir')将返回目录的内容。