在与操作系统交互时使用PHP的正确方法是什么


What is the CORRECT to use PHP in interacting with operating system

我是一位经验丰富的web开发人员,有兴趣获得更多使用Laravel的经验。为此,我希望为我的家庭服务器编写一个基于Laravel的控制面板。同样,这更多的是为了学习体验,而不是其他任何东西。我的问题是:在不造成巨大安全漏洞的情况下,控制系统级服务的正确方法是什么?

我对高管之类的人都很了解,但我想知道实现这一点的公认方法是什么?我考虑了几个选项:

首先,我考虑编写一个"前端式"Laravel应用程序,用户可以与之交互、单击按钮等,并通过unix套接字向"后台"服务(可能是Python)发出命令,该服务读取命令并执行白名单中的命令,从而绕过(或减少)命令注入问题。这将允许我给php-fpm非常有限的权利,但将是更多的工作。

另一方面,我考虑过彻底清除任何用户输入,并赋予php-fpm对系统的提升权限。显然,这会更快,更容易管理,但会有打开一个主要安全漏洞的风险。

最终,我很好奇是否有更有经验的人可以参与进来?我是不是错过了更好的方法?做这件事的标准方法是什么?还是没有标准的方法?一切都在Ubuntu服务器上运行,使用Nginx和PHP-FPM。我已经就这个问题读了很多书,但还没有找到上面问题的答案。此外,我是一个非常精明的Linux管理员,但如果我在做一些愚蠢的事情,不要害怕这么说:)

感谢您抽出时间!

以前,我们通过将事情拆分为两个应用程序来解决这个问题。web应用程序不直接调用任务,而是将状态写入调度表。用过于简化的术语来说,如果您需要前端应用程序来调用

cp /file/one /file/two

您的应用程序会将数据写入一个类似这样的表(再次,过于简化)

command     arguments            job_type         has_run
cp          /file/one,/file/two  account_setup    0

然后,会有一个单独的应用程序,它的工作是监视这个表,并运行任何需要运行的命令。这消除了向PHP进程提供任何提升权限的需要。它还让我们能够拥有它不在的应用程序控制服务器。用于运行作业的单独应用程序还让我们有第二次机会清除字符串,并记录任何攻击应用程序的企图。最后,通过一个单独的应用程序来运行作业,我们可以使用不同的用户帐户来运行不同类型的作业,并只授予这些帐户所需的权限。

如果你想要一种超现代的方法,我想你应该尝试使用消息队列,而不是穷人的"通过MySQL表和cron的队列"——重要的一点是你的PHP应用程序不应该运行命令,你的PHP应用程序应该发送一个命令需要运行的事件。

希望能有所帮助!

如果你不想要一个巨大的安全整体,就不要接受任何用户输入。只有指定的执行命令的shell脚本。

您可以使用shellexec(),并且只在服务器上执行shell脚本。

您应该研究一下Laravel预先需要的Process Component。然而,您仍然需要仔细规划实现,用户输入应仅用于命令选项/参数。