我正在创建一个网站创建服务,用户可以在其中在FTP浏览器界面中上传文件。我也希望他们能够创建真正的目录,但我担心如果他们上传脚本,可能会对服务器造成严重破坏。
我正在使用PHP和mkdir()
函数。在创建目录时使用模式0664
是一个好主意,以防止:
- 恶意文件被执行。
- 防止任何人写入或执行这些文件。
这是个好主意吗?
不,在目录上使用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')
将返回目录的内容。