如何防止 php "exec" 参数中的恶意注入(webhook -> bash 脚本)

How to prevent malicious injection in argument to php "exec" (webhook -> bash script)

我写了一个 webhook 来集成到聊天中(slack / mattermost api)。

启动它的最简单方法 运行 是一个快速的 php 脚本,如下所示:

<?php
$token = $_POST["token"];
$arg = $_POST["text"];

$output = exec("./webhook_script.sh {$token} {$arg}");

就目前而言,脚本工作正常,但我担心有人会恶意地做一个 http POST,其中查询参数 text(脚本:$arg)有一些一种注入攻击。

示例:http://myserver/webhook.php?token=abc&text=123;rm -rf *

所以$arg变成了123; rm -rf并且exec命令执行了一个恶意的rm -rf *

这在本质上与我熟悉的 "sql injection" 相似,但我不确定如何使 bash 脚本安全...

以某种方式引用参数,或者使用 regex 检查脚本参数是否简单?

您需要在每个 shell 参数上调用 escapeshellarg(),然后再将它们传递给 exec()。这将每个参数用单引号括起来并转义可能存在的任何单引号,从而阻止任何此类攻击。

$token = escapeshellarg($_POST["token"]);
$arg = escapeshellarg($_POST["text"]);