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

11

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

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

我正在尝试弄清楚在将它传递给exec函数之前,我需要对process.argv[2]进行哪些操作。 我已经浏览了一段时间,没有找到任何针对这个特定案例的问题或答案。

对于此特定用例,最好的方法是什么我们需要实际做什么?

更新 我仍然在浏览并尝试学习回答自己的问题,并发现这个链接建议我使用js-string-escape(一个node软件包)。 我非常想使用本地/原生方法来解决这个问题。 Node是否有相关工具?

更新2

我最终偶然发现了“命令注入”关键词,并找到了一大堆文章建议使用child_process.execFilechild_process.spawn。 我仍然很好奇是否有本地方法对输入进行清理,同时仍然保护由child_process.exec创建的整个Shell进程。 我希望有人能回答这个问题。

2个回答

2
你的用户输入参数可能包含变量字符,而shell会以自己的方式解释它们。例如,在Linux中,$具有特殊含义。
如果您想直接使用这些参数而避免shell的解释,您需要对它们进行转义。就像在HTML中我们对一些特殊字符进行转义一样(例如<和>具有特殊含义,因此我们在HTML中使用&lt;&gt;进行转义)。这里也是一样的。
因此,回答您的问题首先要找出shell/环境中的特殊字符并对其进行转义。
一个好的经验法则是转义像双引号",单引号',空格,美元符号$(因为它是一个光明会符号,对吧?;-),重音符号`和反斜杠\等字符。
所以假设您的命令如下。要进行转义,只需使用以下简单的正则表达式:
cmd = "npm view --json " + process.argv[2];
escapedCmd = cmd.replace(/(["\s'$`\\])/g,'\\$1');

最初的回答。希望对你有所帮助 :-)


不要试图自己编写代码来进行净化处理——你很可能会错过很多东西。相反,使用一个净化库吧。 - user3207874

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接