允许用户通过 PHP 中的“su -”在服务器上运行 shell 命令

允许用户通过 PHP 中的“su -”在服务器上运行 shell 命令

我从 GitHub 下载了一个库,用于在 PHP 脚本中运行 shell 命令。它的工作原理如下:

    $process = new Process("su - {$login}"); 
    $process->put($password);
    $process->put("\n");
    $process->put($command);
    $process->put("\n");
    $data = $process->get();
    $process->put("exit"); 
    $process->put("\n");

它基于proc_open()。我在我localhost的 Linux 登录名和密码上使用它,一切正常。我想在 Web 服务器上使用这个库。我想尝试'www-data'以登录名登录,但不知道要传递什么www-data's密码。使用什么作为登录名才能允许用户在真实的 Web 服务器(而不是本地主机)上使用此库?

(我把这个问题发到了 stackoverflow 上,但他们给了差评,并说这个问题与编程无关,更多的是服务器故障)

答案1

首先,从 Web 服务器 PHP 脚本运行系统命令,甚至将密码以明文形式存储在 php 脚本中,这其实是个坏主意。想象一下,您正在获取一些用户输入并将其传递给$command,现在如果您错过了一些检查,您将允许恶意用户制作用户参数以在您的系统上运行任意命令。

接下来你实际上不能这样做很可能是因为以下两个原因:

  1. 您的 www-data 用户很可能没有设置任何密码。这将禁止su该用户登录。

  2. 您的 www-data 用户 shell 很可能设置为类似的内容,/sbin/nologin因为该用户不应该以真实用户身份登录系统。

但实际上,您不需要更改用户来运行系统程序。此外,您的发行版很可能有 www-data 用户在其下运行 Web 服务器(使用系统方式),并且您在 Web 服务器上运行的每个 PHP 脚本都已在该用户权限下运行。只需运行命令而不执行 su 即可。如下所示:

$process = new Process($command); 
$data = $process->get();

如果这不起作用,请参阅该库手册,了解如何在没有的情况下生成 shell su,可能$process = new Process('/bin/bash')也会起作用。

相关内容