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

时间:2018-03-27 12:02:58

标签: node.js input exec child-process sanitize

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

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

我想在将process.argv[2]传递给exec函数之前弄清楚我需要做些什么。我已经在这里闲逛了一段时间,并且没有找到任何解决这个具体案例的问题或答案。

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

更新 我还在尝试学习并回答我自己的问题,并发现this link表示我使用js-string-escape(节点包)。我真的很想用本地/香草来做这件事。节点是否有任何工具?

更新2

我终于偶然发现了流行语"命令注入"并找到了一系列建议使用child_process.execFilechild_process.spawn的文章。我仍然很好奇是否有本地方法来清理输入,同时仍然保护child_process.exec创建的完整shell进程。我希望有人可以回答这个问题。

2 个答案:

答案 0 :(得分:0)

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

如果您想按原样使用此类参数以避免shell解释,则必须对其进行转义。我们对HTML中的某些特殊字符也是如此(例如<和>具有特殊含义,因此我们习惯于在HTML中像&lt;&gt;那样转义它们)。此处同样适用。

因此,您的问题的答案是首先找出外壳/环境中的特殊字符并将其转义。

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

因此,假设您的命令是下面的命令。要逃脱它,只需使用一些简单的正则表达式,例如:

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

我希望它会有所帮助:-)

答案 1 :(得分:0)

尝试使用npm软件包escape-it。应该可以与* nix操作系统一起使用,但也支持Windows。