Пример того, как использование eval в этом сценарии для анализа входных данных раскрывает и ставит под угрозу все частные области вашего приложения.
app = (function(){
// my app with all its shiny little secrets
// stored in private variables
var secret = 42;
var apiUrl = "/api/";
return {
withEval(input){
var someObject = eval(input);
console.log("withEval", someObject);
if(apiUrl === "/api/"){
console.log("xhr to", apiUrl);
}else{
console.warn("xhr to", apiUrl);
}
},
withFunction(input){
var someObject = Function("return(" + input+")")();
console.log("withFunction", someObject);
if(apiUrl === "/api/"){
console.log("xhr to", apiUrl);
}else{
console.warn("xhr to", apiUrl);
}
},
}
})();
var malware = `(${
()=>{
try { console.warn("found secret", secret); } catch(err){ console.error(err); }
try { console.warn("found apiUrl", apiUrl); } catch(err){ console.error(err); }
apiUrl = "http://attacker.example.com/";
}})(),{ foo: 13, bar: 42 }`;
console.log(malware);
app.withFunction(malware);
console.log("-----------------");
app.withEval(malware);
С eval
раскрывается ваш «секрет», такой как идентификаторы, токены, ... и даже «apiUrl» был изменен, поэтому все ваши api-вызовы теперьсовершите обходной путь по веб-странице какого-нибудь злоумышленника.
И ваш код даже не выдаст ошибку;Я зарегистрировал эти ошибки в консоли.