Esprima检测全局范围访问

时间:2018-02-12 14:20:13

标签: javascript security

是否可以使用esprima(或其他类似工具)100%检测一段不受信任的代码是否尝试访问其运行的函数范围之外的变量?

window.foo = 5
var func = new Function('"use strict"; console.log(foo);')
func.call(null)

这将记录5.我可以使用func.call(null)阻止在函数中可用,并在不受信任的代码前加上“use strict”。

我假设我也可以用esprima分析代码,甚至是eslint并检测func svope中不存在的变量,对吗?它是100%安全的吗?我知道代码仍然行为不端,例如做了一段时间(真实){},但除了长期运行的代码之外,它是否“范围安全”?

2 个答案:

答案 0 :(得分:2)

  

我假设我也可以使用esprima分析代码,甚至是eslint并检测函数范围中不存在的变量,对不对?

  

100%安全吗?

不,一点也不。请考虑new {}.constructor.constructor("alert('evil!')")(),它不会访问任何变量。

答案 1 :(得分:0)

正如Bergi所指出的,这根本不安全。如果您想运行不受信任的代码,可以试试sandbox

示例:

var s = new Sandbox()
s.run( '1 + 1 + " apples"', function( output ) {
  // output.result == "2 apples"
})