5 个版本 (2 个稳定版)

1.0.1 2024 年 1 月 27 日
1.0.0 2024 年 1 月 24 日
0.2.1 2024 年 1 月 22 日
0.2.0 2024 年 1 月 22 日
0.1.0 2024 年 1 月 22 日

#267网络编程

AGPL-3.0

26KB
287

http-cmd

通过 HTTP 运行命令

⚠️ 警告 ⚠️

不要将 http-cmd 暴露在互联网上,特别是与执行代码(例如 python)或命令(例如 bash)的程序一起。否则,可能会执行任意代码和程序(即被黑客攻击)!

动机

构建此工具的动机是,像 Zola 这样的静态站点生成器出于安全原因不允许执行外部命令。您不希望在构建静态网站时执行任意程序!想象一下被第三方主题黑掉 😱

然而,此类静态站点生成器支持获取远程数据。这导致了 http-cmd 的工作原理的漏洞

  • 💻️ 运行一个等待 POST 请求的本地 HTTP 服务器,并使用其正文作为标准输入或外部命令的命令参数
  • ⬆️ 让静态站点生成器发送 POST 请求以运行外部命令
  • ⬇️ 将响应正文嵌入为外部命令的输出
  • 🎉 赚钱!

您可以在 zola_examples 目录中找到使用 http-cmd 与 Zola 的示例。

用例

以下是一些可能的用例

安装

您可以通过运行 Cargo 安装 http-cmd

cargo install http-cmd

您可以使用 cargo-update 更新它。

如果您不想与 Rust 工具链一起安装 Cargo,请提交一个问题,我将发布一个您可以用 Docker 或 Podman 运行的容器镜像。

配置

http-cmd 需要在执行目录中找到配置文件 http-cmd.toml。但您也可以使用 -c 命令行选项提供配置文件的路径。

参数 描述 默认值
ip 要绑定的 IPv4/IPv6 地址 "127.0.0.1"
端口 监听端口 8080
max_request_body_size 请求体最大字节数 1048576 (1 MiB)
commands 命令配置列表
commands.name 命令的名称。它用于在 http://IP:PORT/NAME 下执行命令。仅允许字符 az(小写)、09-
commands.stdin 请参阅下面的 模式 部分
commands.program 当调用 http://IP:PORT/NAME 时执行的程序。可以是可执行文件的绝对或相对路径。否则,将像运行 Unix which 命令一样搜索可执行文件
commands.args 程序的参数列表

模式

http-cmd 有两种运行程序的模式。通过布尔配置值 stdin 选择模式

  • 对于 stdin = true,请求体被管道传输到命令的标准输入。
  • 对于 stdin = false,请求体被拆分为配置 args 后提供的参数。请参阅下面的 ls 命令示例。

演示

以下是一个示例配置文件

# The default
ip = "127.0.0.1"

# The default
port = 8080

# 2 KiB instead of the default of 1MiB
max_request_body_size = 2048

[[commands]]
name = "rev"
stdin = true
program = "rev"
args = []

[[commands]]
name = "ls"
stdin = false
program = "/usr/bin/ls"
args = ["-l"]

如果您将此配置保存到文件 http-cmd.toml 并运行 http-cmd,则将启动一个服务器,监听 http://127.0.0.1:8080/revhttp://127.0.0.1:8080/ls

现在运行

curl http://127.0.0.1:8080/rev -d "Hello World!"

此命令发送一个包含正文 "Hello World!" 的 POST 请求。输出应该是反转的文本: "!dlroW olleH" 🎉

http-cmd 在这里设置 stdintrue 时执行的等效操作如下管道

echo -n "Hello World!" | rev

为了测试第二个命令,运行

curl http://127.0.0.1:8080/ls -d "src zola_examples"

输出取决于两个目录的内容。

此命令也发送 POST 请求,但由于为 ls 命令设置了 stdinfalse,因此应用了第二个 模式。这意味着 http-cmd 执行命令 ls -l src zola_examples。参数 srczola_examples 被放置在程序 ls 和其配置的参数之后(这里只有 -l)。

依赖项

~11–22MB
~325K SLoC