我们有一个在 FreeBSD 上运行 Lighttpd 的网络服务器。
我们的一些客户要求 FTP 访问他们的服务器。对于他们中的大多数人来说,使用 FTP 守护程序将他们 chroot 到“文件”目录中,以便他们可以上传孩子的照片或诸如此类的东西就足够了,然后我们只需将 Lighty 配置为在请求该目录中的文件时不启动 FastCGI。但至少有一个客户需要访问他们的整个 webroot。好的,所以我将 FTP 守护程序设置为 umask 022 所有上传的文件(因此权限变为 rw-r--r--),并认为我非常聪明。
然而,我注意到(幸好不是很难发现),如果文件仅设置了相关的读取位,PHP 脚本在服务器上是可执行的;执行位(或缺少执行位)将被忽略。这是怎么回事?我以为必须设置执行位才能使文件,你知道,执行…
有没有简单的方法可以阻止 Lighty 和/或 PHP 执行没有执行位的脚本?(我已经在 Freenode 上尝试过 #lighttpd,但他们似乎认为这不可能。)
答案1
执行位与 HTTP 服务器无关。CGI 脚本需要它,因为 HTTP 服务器使用 exec(3)(及其相关函数)来执行它们。另一方面,PHP 脚本被读取和执行,因为 Web 服务器的配置允许它们这样做。
因此,您的快速选择是删除 读从 PHP 脚本中获取您想要的 HTTP 服务器不是 执行。
阅读你的网络服务器的配置手册,了解是否可以有选择地(每个目录)执行 PHP 脚本(我确实运行了 lighttpd,但不知道是否可行)。
答案2
我记得如果你通过 CGI+PHPsuExec/suphp(或 FastCGI+suExec/suphp)运行 PHP,默认情况下它对权限(和所有权)非常挑剔,尽管我不确定这在多大程度上是由于 PHP 或 PHPsuExec/suphp 造成的 - 这就是为什么有些(包括我自己的共享 Web 服务器)以这种方式运行而不是通过 Apache 模块运行的原因。它要求脚本设置用户执行位,并且如果设置了组写入或其他写入位,并且对脚本所在的目录进行类似检查,它将不会运行。
但是我在使用 PHP 的机器上运行 Apache,所以我无法告诉您如何在 lighttpd 下进行配置。