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

Kra*_*ken 5 input exec sanitize child-process node.js

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

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

我试图弄清楚process.argv[2]将其传递给exec函数之前需要做什么。我已经浏览了一会儿,还没有发现任何针对此特定情况的问题或答案。

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

更新 我仍在尝试学习和回答自己的问题,并发现此链接建议我使用js-string-escape(节点程序包)。我真的很想使用本机/香草来做到这一点。节点是否为此有任何工具?

更新2

最后,我偶然发现了“命令注入”这个流行语,并发现了许多推荐使用child_process.execFileor 的文章child_process.spawn。我仍然很好奇是否有一种本机的方法来清理输入,同时仍然保护所创建的完整shell进程child_process.exec。我对此保持开放,希望有人能回答。

Eug*_*scu 2

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

如果您想按原样使用此类参数以避免 shell 解释,则必须转义它们。我们对 HTML 中的一些特殊字符执行同样的操作(例如 < 和 > 具有特殊含义,因此我们在 HTML 中使用&lt;和 分别对它们进行转义&gt;)。这同样适用于这里。

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

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

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

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

我希望它有帮助:-)