0

这是我的问题:我希望将一些十六进制数据从 PHP 传递给外部应用程序:

exec('echo "'.$message.'" | /usr/bin/gateway');

$message 来自用户输入:

测试'”/'\'/”\””//

addslashes(), stripslashes() 不能解决我的问题。使用时:

$message = stripslashes($_POST['message']);

我可以看到控制台日志:

sh: 1: Syntax error: Unterminated quoted string

或空值

所以我开始思考,将输入转换为十六进制值并传递它们可能会有所帮助:

exec('echo -e '.$message.' | /usr/bin/gateway');

但是后来我在将十六进制数据传递给那个回声时遇到了麻烦。

所以我的问题是如何做到这一点?我需要将用户写入的完全相同的字符串传递给网关服务。- 将用户输入转换为十六进制形式,并将其放在 echo -e 中(如何?) - 或者以某种方式与引号和斜杠进行斗争

4

1 回答 1

0

在一般情况下,由于 shell 的转义规则,您不能通过 shell 传递用户输入。您应该做的是处理新生成的进程的标准输入流并直接提供它。

您可以使用它popen来执行此操作:

$handle = popen('/usr/bin/gateway', 'w');
fwrite($handle, $_POST['message']);
pclose($handle);

如果您需要做的比示例显示的更多并且popen没有提供足够的功能,proc_open这是一个更复杂和更强大的替代方案。

警告:将未经过滤的用户输入提供给外部进程会使您容易受到与进程如何解释和处理该输入相关的攻击。如果不受信任的用户可以访问您的应用程序,请强烈考虑将输入列入白名单!

于 2013-04-18T09:25:07.290 回答