以下javascript是否可以防止任意代码执行?

以下javascript是否可以防止任意代码执行?,javascript,node.js,security,xss,Javascript,Node.js,Security,Xss,我正在创建一个javascript框架,该框架具有与以下代码等效的代码: eval("'" + user_input.replace(/'/g, "'") + "'"); 我知道这很糟糕,没必要说服我。我想知道的是,我可以在这里注入任意代码吗 乍一看,user_input.replace(“'”,“';”)似乎会阻止我跳出字符串。但是,我可以传入换行符,例如\nalert(123)\n,但结果总是语法错误,例如 ' alert(123) ' 除了引起语法错误之外,这里是

我正在创建一个javascript框架,该框架具有与以下代码等效的代码:

eval("'" + user_input.replace(/'/g, "'") + "'");
我知道这很糟糕,没必要说服我。我想知道的是,我可以在这里注入任意代码吗

乍一看,
user_input.replace(“'”,“';”)
似乎会阻止我跳出字符串。但是,我可以传入换行符,例如
\nalert(123)\n
,但结果总是语法错误,例如

'
alert(123)
'

除了引起语法错误之外,这里是否还有代码注入的向量?

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

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

example\
然后,经过计算的代码将是

'example\'
这将导致语法错误,因为
eval
中包含的字符串从未终止。但是,如果实际的
评估
实际上更复杂,这是可以利用的。例如,如果代码为:

var escaped_input = user_input.replace(/'/g, "&39;");
eval("'" + escaped_input + "' some more stuff '" + escaped_input + "'");
然后,可以使用如下输入来利用它:

; alert(1); // \
这将导致:

'; alert(1); // \' some more stuff '; alert(1); // \'
                                      ^^^^^^^^^

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

我几乎可以保证您可以在这里进行某种注入…
user\u input='window.location='http://example.com"“
@Matt,那没什么用。这是评估
'window.location='http://example.com“
,所以它只是一个字符串对我来说确实很安全,但你根本无法评估任何东西,所以我不知道你如何将它用于有用的东西?上下文是什么?当然,这不仅仅是一个对字符串求值的过程,因为这不会起任何作用。你能告诉我们剩下的内容吗?是的,在node.js repl中,我可以用
user\u input=“console.log(42)\\”
让它暂停等待字符串的结尾。这听起来不太正确
eval()
对于格式错误的输入,应该抛出一个语法错误,而不是暂停解释器。是的,在程序中,但在repl中,它只是等待您键入更多。这不应该发生
eval()
应该是自包含的-它不应该能够触发REPL开始做任何事情。我只是说我通过启动一个节点REPL并在那里运行
eval
来测试反斜杠。这就是全部。它甚至没有到达eval,因为它仍然在等待引号关闭字符串文本。这就是全部。