清理 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.execFile
或child_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 函数?