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

标签 php bash http-post code-injection webhooks

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

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

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

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

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

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

所以 $arg 变成了 123; rm -rfexec 命令执行恶意的 rm -rf *

这在本质上类似于我熟悉的“sql 注入(inject)”,但我不确定如何使 bash 脚本安全...

以某种方式引用参数,或者使用 regex 来检查脚本参数是一件简单的事情吗?

最佳答案

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

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

关于php - 如何防止 php "exec"参数中的恶意注入(inject)(webhook -> bash 脚本),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36884051/

相关文章:

php - 使用 PHP 格式化 HTTP POST 请求中的数据

php - 在 Node.js 中模仿 PHP 的 __get(), __set() & __call() 魔术方法

php - 停止动态下拉列表中的重复行

ruby-on-rails - Rails 应用程序不读取 .bashrc 中的环境变量

linux - 大学项目(bash shell)

android - 使用 android 复制来自 fiddler 的 HttpPost 请求

php - 在 mysql 中处理大型递归查询的最佳方法是什么?

javascript - 调试 AJAX 请求

regex - AWK 匹配以数字开头的字符串

java - 将 POST 请求 header 发送到 Web 服务器