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

在与操作系统交互时使用PHP的正确方法是什么,php,laravel,Php,Laravel,我是一位经验丰富的web开发人员,希望获得更多的Laravel经验。为此,我希望为我的家庭服务器编写一个基于Laravel的控制面板。再次强调,这更多是为了学习体验,而不是其他任何东西。我的问题是:在不造成巨大安全漏洞的情况下,控制系统级服务的正确方法是什么 我对exec之类的东西了如指掌,但我想知道人们普遍接受的实现方法是什么?我考虑了几个选项: 首先,我考虑编写一个“前端ish”Laravel应用程序,用户可以与之交互、单击按钮等,并通过unix套接字向“后台”服务(可能是Python)发出

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

我对exec之类的东西了如指掌,但我想知道人们普遍接受的实现方法是什么?我考虑了几个选项:

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

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

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


谢谢你抽出时间

如果你不想要一个庞大的安全系统,就不要接受任何用户输入。仅具有执行命令的指定shell脚本


您可以使用shell_exec()并仅在服务器上执行shell脚本。

您应该了解Laravel预先要求的脚本。但是,您仍然需要仔细规划实现,用户输入应该只用于命令选项/参数。

早在我们解决这一问题的时候,我们就通过将内容分为两个应用程序来解决。web应用程序不会直接调用任务,而是将状态写入分派表。如果您需要前端应用程序调用

cp /file/one /file/two
您的应用程序将数据写入一个类似这样的表中(同样,过于简化)

然后,将有一个单独的应用程序,其任务是监视此表,并运行任何需要运行的命令。这样就不需要给PHP进程任何提升的特权。它还使我们能够拥有它不在的应用程序控制服务器。用于运行作业的单独应用程序还为我们提供了第二次清理字符串的机会,以及攻击应用程序的任何尝试的事实日志。最后,通过一个单独的应用程序来运行作业,我们可以使用不同的用户帐户来运行不同类型的作业,并且只给这些帐户所需的权限

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


希望有帮助

是的,不用说。问题的一部分是,我对让php fpm运行服务xyz start | stop | restart等所需的高级Perm非常偏执。@CRK只要您在命令中不使用用户输入或正确清理用户输入,您就会没事。是的,这正是我试图表达的想法——尽管我可能做得不好。我确实喜欢这样,尽管这可能意味着更多的工作,但这远比赋予web应用更高的权限要好得多。你能推荐更多关于这个主题的阅读吗?Laravel的队列文档可能是一个很好的开始。另外,看看像cPanel这样的系统和它的各种克隆如何处理这个问题,这将是另一个开始挖掘的地方。
command     arguments            job_type         has_run
cp          /file/one,/file/two  account_setup    0