php - 将十六进制数据从 PHP 传递到外部程序

标签 php linux exec echo stripslashes

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

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

$message 来自用户输入:

test'"/'\'/"\""//

addslashes()、stripslashes() 并不能解决我的麻烦。 使用时:

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

这是我可以看到的控制台日志:

sh: 1: Syntax error: Unterminated quoted string

或空值

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

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

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

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

最佳答案

一般情况下,由于 shell 的转义规则,您无法通过 shell 传递用户输入。您应该做的是获取新生成的进程的标准输入流的句柄并直接提供它。

您可以使用popen为此:

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

如果您需要做的事情超出示例所示,并且 popen 没有提供足够的功能,proc_open是一个更复杂、更强大的替代方案。

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

关于php - 将十六进制数据从 PHP 传递到外部程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16078913/

相关文章:

linux - 使用 socat 进行原始串行连接

c - 如何在使用 dup2(..) 和使用 execvp(...) 后重定向回标准输出

php - 如何从 Action 中在后台正确运行 Symfony 任务?

php - 仅在 php mysqli 中获取数组中的第一项

php - MySql 计数不准确。代码点火器

php - 使用对象作为参数与在方法中创建对象

php - 如何在 Laravel 中验证电话号码?

linux - 如何解释 fio iops 日志文件?

c++ - strtod() 的可怕错误 : glibc-2. 13 不向后兼容 glibc-2.9?

C - 重定向子进程的IO