使用PHP与操作系统交互的CORRECT是什么

时间:2015-02-26 17:02:36

标签: php laravel

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

我知道所有关于执行官等的事情,但我想知道普遍接受的方法是什么?我考虑了几个选项:

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

另一方面,我认为只是消除任何用户输入的地狱,并在系统上提供php-fpm提升权限。显然这会更快,更容易管理,但是会冒着打开重大安全漏洞的风险。

最终,如果有经验丰富的人能够对此产生影响,我很好奇吗?我错过了更好的方法吗?这样做的标准方法是什么?或者没有标准的方法?一切都在Ubuntu Server上运行,使用Nginx和PHP-FPM。我已就这个问题做过相当多的阅读,但尚未找到上述问题的答案。此外,我是一个非常精明的Linux管理员 - 但如果我做某事愚蠢,不要害怕这样说:)

感谢您的时间!

3 个答案:

答案 0 :(得分:2)

当天我们通过将事物分成两个应用来解决这个问题。您的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应用程序应该发送一个命令需要运行的事件。

希望有所帮助!

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您应该查看Laravel预先要求的Process Component。但是,您仍需要仔细规划实现,用户输入应仅用于命令选项/参数。