我正在使用节点编写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.execFile
或child_process.spawn
的文章。我仍然很好奇是否有本地方法来清理输入,同时仍然保护child_process.exec
创建的完整shell进程。我希望有人可以回答这个问题。
答案 0 :(得分:0)
您的用户输入参数可能包含变量char,shell会以自己的方式解释它们。因此,例如,在Linux中,$具有特殊含义。
如果您想按原样使用此类参数以避免shell解释,则必须对其进行转义。我们对HTML中的某些特殊字符也是如此(例如<和>具有特殊含义,因此我们习惯于在HTML中像<
和>
那样转义它们)。此处同样适用。
因此,您的问题的答案是首先找出外壳/环境中的特殊字符并将其转义。
一个好的经验法则是转义字符,例如双引号"
,单引号'
,空格,美元符号
$
(因为它是是光明会的符号,对吗?;-),重音符号`
和明显的反斜杠\
。
因此,假设您的命令是下面的命令。要逃脱它,只需使用一些简单的正则表达式,例如:
cmd = "npm view --json " + process.argv[2];
escapedCmd = cmd.replace(/(["\s'$`\\])/g,'\\$1');
我希望它会有所帮助:-)
答案 1 :(得分:0)
尝试使用npm软件包escape-it。应该可以与* nix操作系统一起使用,但也支持Windows。