如何为PHP / Exec提供更多权限?

时间:2017-05-12 14:03:47

标签: php nginx command-line-interface

我有一个简单的命令,看起来像这样:

$command = sprintf('cd %s && node app > /dev/null 2>&1 &', $this->get('node_dir'));

exec($command, $output, $return_var);

主要问题是它无法在浏览器中运行...如果我从控制台或php-cli执行它,它可以正常工作,但不能从浏览器中运行。

据我所知,问题是用户www-data没有足够的权限来启动它。我该如何解决?

命令不需要sudo

2 个答案:

答案 0 :(得分:0)

如果没有更多细节,很难确切地说出你需要做什么,但缺点是用PHP修复权限问题与修复linux中的任何权限问题完全相同。使用此命令可能会遇到两个许可问题:

  1. CD
  2. 节点
  3. 具有限制权限的目录可能会阻止给定用户首先使用CD进行访问。检查这个的最简单方法是将给定目录的所有权(如果可能)更改为www-data:

    chown www-data:www-data / path / to / directory

    另一个问题是节点可能没有您的用户的执行权限。您必须检查节点命令的执行权限是否允许任何人执行,或者只是一组有限的用户/组。这更容易或更难,具体取决于node命令是否安装在有问题的文件夹中,还是全局安装在系统上。您可以通过CD自行检查并运行:

    哪个节点

    它可能是全局的,在这种情况下,所有用户可能都拥有执行权限。

    您也可以考虑更改PHP运行的用户,尽管这有自己的包袱。这样做的方式取决于PHP的运行方式(apache,PHP-FPM等),所以我不能再给出提示,但这是你可以研究的东西。如果PHP作为更高权限的用户运行,则其中一些权限问题可能会消失,但如果有人在您的代码中发现远程执行代码漏洞,您也会受到较少的保护。

答案 1 :(得分:0)

您可以将命令移动到shell脚本,将脚本的所有者更改为某个“强大”用户,允许所有用户执行脚本权限,并设置setuid位

这样任何用户都可以启动脚本,包括www-data,但是,如果设置了setuid位,它将按照所有者的权限执行,就像所有者启动它一样。

在PHP中,您将调用

$command = sprintf('myscript.sh %s', $this->get('node_dir'));
exec($command, $output, $return_var);

myscript.sh应该使用第一个参数,并使用它做你想做的事情,这样的事情( UNTESTED ,我不擅长shell脚本!)

cd $1 && node app > /dev/null 2>&1 &

注意$1:您将在这里找到node_dir id

然后您可以使用chown分配所有权并允许执行并使用chmod

设置setuid位
sudo chmod 4755 myscript.sh

有关setuid的信息: https://en.wikipedia.org/wiki/Setuid

如果任何用户可以使用更强的权限执行此操作,请注意您在脚本中添加的内容!

我并不认为这是一种安全的方式,特别是不知道node_dir参数内可以结束的内容!

<强> P.S:

您也可以用PHP编写脚本,然后调用

$command = sprintf('myscript.php %s', $this->get('node_dir'));
exec($command, $output, $return_var);

这样您就可以将执行传递给CLI PHP。如果设置了setuid位,则权限将更改为脚本的所有者。脚本应以#!/ usr / bin / php开头,或者为您的PHP更正“shebang”,并使用chmodsudo chmod 4755 myscript.php

创建可执行文件