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

Posted

技术标签:

【中文标题】在 PHP mkdir 中使用模式 0664 是个好主意吗?【英文标题】:Is using mode 0664 in PHP mkdir a good idea? 【发布时间】:2016-06-11 03:59:22 【问题描述】:

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

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

    恶意文件被执行。 阻止任何人编写或执行这些文件。

这是个好主意吗?

【问题讨论】:

我想知道目录上的644 是否使有所不同。我在 cpanel 服务器上有各种权限设置的 php 文件,它们总是运行良好,而 php 文件本身就是 644! @AaronGillion,我想这是我的问题! ;) 我不确定我是否会给它写入组的权限。这实际上取决于您的服务器设置,当用户浏览内容时哪个用户/组正在访问内容等。 【参考方案1】:

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

0644 目录只能由root 访问。

示例

无法访问:

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') 会返回目录的内容。

【讨论】:

【参考方案2】:

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

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

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

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

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

【讨论】:

以上是关于在 PHP mkdir 中使用模式 0664 是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

Php中使用mkdir如何创建多级目录?

PHP中的递归chmod

php中mkdir()函数的权限问题分析

PHP使用mkdir创建多级目录的方法

PHP 无法使用 mkdir 创建目录

PHP mkdir不使用具有“系统操作”或“设备”引用名称的文件夹