此解决方案是否使eval安全?

时间:2017-04-04 15:00:29

标签: javascript eval

我的系统需要让最终用户在javascript中键入一个函数,但我担心XSS攻击,所以我尝试了一些解决方案,比如用户输入一些关键字,避免保存。目前,我有一个想法,但我不知道它足够安全。

你能告诉我这个解决方案的任何弱点吗?



// end-user definte this port;
var userDefFunString = `function(i){
    // document is undefined
  	return document;
}`;

// this template make keyworks become undefined, there are more, but they are to loog, so for demo purpose, I remove them.
var template = `(function secureEval(input){
	var window, document, localStorage, sessionStorage = undefined;
	var fun =` + userDefFunString + `
  
  return fun(input);
})`


let secureFun = eval(template);

//the result should be true
console.log(secureFun("10") === undefined)




1 个答案:

答案 0 :(得分:1)

绝对不是!我可以使用; alert('Hacked')或类似的东西:

(/* Malicious Code */, _ => console.log('Valid Input Function'))

作为输入,它已经是一个成功的XSS。你永远不应该接受JS作为输入!

您应该考虑创建一个解析器令牌设计,在其中为它们提供可以使用的预设函数列表,然后将它们解析为代码。

仅供参考,恶意行为者可以使用大量资源使其无法检测到攻击媒介。例如:JsFuckJs Obfuscator