如何防止 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"]);
我写了一个 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"]);