以下javascript是否可以安全地执行任意代码?

blu*_*ume 9 javascript security xss node.js

我正在贡献一个javascript框架,它具有以下代码的等价物:

eval("'" + user_input.replace(/'/g, "'") + "'");
Run Code Online (Sandbox Code Playgroud)

我知道这太可怕了 - 不需要说服我.我想知道的是,我可以在这里注入任意代码吗?

乍一看user_input.replace("'", "'")似乎会阻止我突破弦乐.但是我可以传递新行,例如\nalert(123)\n,但结果总是语法错误,例如

'
alert(123)
'
Run Code Online (Sandbox Code Playgroud)

这里是否实际存在代码注入的向量,而不仅仅是导致语法错误?

dus*_*uff 8

虽然这无疑是一种令人担忧的模式,但如果完全按照描述的方式使用它是安全的.可以在Javascript中终止单引号字符串的唯一字符是单引号字符.只要该字符没有出现在插入单引号的字符串中,就不能将其解释为除字符串之外的任何内容.

关于我能想到的最糟糕的事情是你可以做的是用反斜杠结束一个字符串,这将导致一个未终止的字符串,例如,如果user_input是:

example\
Run Code Online (Sandbox Code Playgroud)

然后评估的代码将是

'example\'
Run Code Online (Sandbox Code Playgroud)

这将导致语法错误,因为包含在其中的字符串eval永远不会终止.但是,如果真实eval实际上更复杂,那么这是可以利用的.例如,如果代码是:

var escaped_input = user_input.replace(/'/g, "&39;");
eval("'" + escaped_input + "' some more stuff '" + escaped_input + "'");
Run Code Online (Sandbox Code Playgroud)

那么它可以通过输入来利用:

; alert(1); // \
Run Code Online (Sandbox Code Playgroud)

这将导致:

'; alert(1); // \' some more stuff '; alert(1); // \'
                                      ^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

其中带下划线的内容将被评估,因为应该退出字符串的引用被转义,将下一个单引号转换为结束引用!为了安全起见,我建议尽可能转义或替换反斜杠(除非你明确地试图用它eval()来处理它们,在这种情况下你可能只是捕获异常).