我的系统需要让最终用户在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)

答案 0 :(得分:1)
绝对不是!我可以使用; alert('Hacked')
或类似的东西:
(/* Malicious Code */, _ => console.log('Valid Input Function'))
作为输入,它已经是一个成功的XSS。你永远不应该接受JS作为输入!
您应该考虑创建一个解析器令牌设计,在其中为它们提供可以使用的预设函数列表,然后将它们解析为代码。
仅供参考,恶意行为者可以使用大量资源使其无法检测到攻击媒介。例如:JsFuck,Js Obfuscator