清理 child_process.exec 命令的用户输入

Posted

技术标签:

【中文标题】清理 child_process.exec 命令的用户输入【英文标题】:sanitize user input for child_process.exec command 【发布时间】:2018-09-05 19:58:15 【问题描述】:

我正在使用 node 编写 CLI,我已经到达了接受用户输入并将其附加到作为 child_process.exec 函数命令的字符串的部分。

const CURL_CHILD = exec('npm view --json ' + process.argv[2] + ...

在将 process.argv[2] 传递给 exec 函数之前,我试图弄清楚我需要对它做什么。我已经浏览了一段时间,但没有找到任何针对此特定案例的问题或答案。

针对此特定用例清理此用户输入的最佳方法是什么?这里实际需要什么?

更新 我仍在四处寻找并尝试学习和回答我自己的问题,并找到了this link,这表明我使用js-string-escape(一个节点包)。我真的很想使用原生/香草的东西来做到这一点。 node 有这方面的工具吗?

更新 2

我终于偶然发现了“命令注入”这个流行词,并找到了大量推荐使用child_process.execFilechild_process.spawn 的文章。我仍然很好奇是否有一种本地方式来清理输入,同时仍然保护child_process.exec 创建的完整 shell 进程。我留下这个开放,希望有人可以回答它。

【问题讨论】:

【参考方案1】:

您的用户输入参数可能包含 shell 将以自己的方式解释它们的可变字符。例如,在 Linux 中,$ 具有特殊的含义。

如果你想使用这样的参数来避免 shell 解释,你必须转义它们。我们对 html 中的一些特殊字符也是如此(例如, 具有特殊含义,因此我们使用 HTML 中的 <> 分别转义它们)。这里也一样。

所以你的问题的答案是首先找出你的外壳/环境中的特殊字符并将它们转义。

一个好的经验法则是转义字符,例如双引号"、单引号'、空格、美元符号$(因为它是光明会的符号,对吗?;- ),重音 ` 和明显的反斜杠 \

所以让我们假设您的命令是下面的命令。要逃避它,只需使用一些简单的正则表达式,如下所示:

cmd = "npm view --json " + process.argv[2];
escapedCmd = cmd.replace(/(["\s'$`\\])/g,'\\$1');

希望对你有帮助:-)

【讨论】:

【参考方案2】:

试试 npm 包escape-it。应该适用于 *nix 操作系统,但也支持 Windows。

【讨论】:

以上是关于清理 child_process.exec 命令的用户输入的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Bluebird 承诺 Node 的 child_process.exec 和 child_process.execFile 函数?

child_process.exec未在路径中找到cmd

nodejs执行cmdshell命令

如何在nodejs里调用执行系统命令

Electron —— 执行DOS命令有乱码

NodeJs之child_process