在PHP中访问CLI程序最安全的方法是什么

在PHP中访问CLI程序最安全的方法是什么,php,web-services,Php,Web Services,我正在编写一个PHP库,它需要访问系统并访问一个没有PHP接口(或PHP库)的命令行程序。因此,我想知道访问系统以从CLI程序检索输出的最佳(也是最安全的)方法是什么?我已经查看了system()和exec(),但仍然不确定在这种情况下使用哪种方法最好 该库将获得一个用户传递的文本字符串,并将其传输到命令行,检索回另一个文本字符串。显然,通过向CLI传递用户提供的数据,我将进行验证以确保无法传递任何可执行数据 理想情况下,您可以从预定义的可能输入列表中使用passthru()(这样,如果用户in

我正在编写一个PHP库,它需要访问系统并访问一个没有PHP接口(或PHP库)的命令行程序。因此,我想知道访问系统以从CLI程序检索输出的最佳(也是最安全的)方法是什么?我已经查看了
system()
exec()
,但仍然不确定在这种情况下使用哪种方法最好


该库将获得一个用户传递的文本字符串,并将其传输到命令行,检索回另一个文本字符串。显然,通过向CLI传递用户提供的数据,我将进行验证以确保无法传递任何可执行数据

理想情况下,您可以从预定义的可能输入列表中使用
passthru()
(这样,如果用户
input==“operation\u a”
您就可以
{passthru('operation\u a');}
而不用担心输入的消毒)。否则,使用
passthru()
passthru()
允许您捕获命令的输出并将整个块传递回浏览器。如果您希望获得二进制输出(如图像生成等),则此函数特别有用。

我建议与和一起使用


澄清一下(当我第一次发布这个答案时,我正忙着):保护shell命令的正确方法是:

$exe = 'cat';
$args = array('/etc/passwd');

$args = array_map('escapeshellarg', $args);

$escaped = escapeshellcmd($exe . ' ' . implode(' ', $args));
下面是上述代码的一部分(也是一部分)

当然,以上只是一个虚构的例子。但主要思想是对每个参数应用
escapeshellarg()
,然后对整个命令字符串(包括可执行文件的路径和以前转义的参数)调用
escapeshellcmd()
。在任意命令中,这是非常关键的


注意:所谓安全,我的意思是通过转义具有特殊含义的字符,例如
是,否,可能?如果不是肯定的,请澄清您期望的结果?请您解释一下您决定使用Alix的答案吗?我很想知道您的研究/编程是如何发展的,以及您为什么选择这种方法。谢谢。@L0j1k:我没听懂…@L0j1k:很抱歉也通知你,但你似乎也很感兴趣。我在我的回答/建议中发布了更深入的理由。不需要道歉!我对这项研究的结果很感兴趣,希望coryb将他的最终解决方案作为对他使用的任何方法的评论,甚至发布他自己的答案。我不是妓女,我只是对他分享他从这个问题和解决方案中学到的智慧非常感兴趣。:)谢谢你提供的信息,我会考虑使用它。我正在使用
LibLouis
框架附带的
xml2brl
程序。我正在做的是将纯ASCII文本传递给程序,然后返回盲文ASCII格式的文本。我将复制程序中所有可用的选项,除了我正在构建的新PHP库中的可执行文件。是否有一种方法可以对输入进行沙箱处理,以便在出现问题时不会对系统造成伤害?您可以虚拟化正在运行命令的平台(想想Virtualbox下运行执行命令的PHP页面的Linux),但最终,你只是不想成为邻居中挂得最低的水果。你为什么推荐这些?这些函数比只使用exec()或system()函数更好吗?@coryb:请参阅和。在哪些情况下,当参数已经用
escapeshellarg
转义时,有必要在整个命令上使用
escapeshellcmd
?@AlfEaton:当命令是任意命令时(即:来自用户输入-如果不将其列入白名单,则仍然很危险)或包含不常见的字符。@AlixAxel在这种情况下,只需转义命令名($exe),而不转义整个命令?