JavaScript - 如何从 eval 脚本中隐藏全局范围

标签 javascript global-variables eval information-hiding

我通常将全局范围视为始终可以从任何地方访问的 namespace 。我想知道在理论上是否可以完全隐藏 全局范围。例如,假设我们有一些代码想要evaluate(在浏览器的控制台中):

var code = 
  "console.log(this);   " + // access the global object directly
  "console.log(window); " + // access the global object as the window object
  "newGlobalVar = 42;   ";  // implicitly create global object
eval(code);

通过包装 eval 调用,thiswindow 可以从 code 中隐藏:

(function (window) { eval(code); }).call({});

但我无法阻止 code 隐式创建全局变量。有可能吗?我不想使用这些东西,我只是好奇。

最佳答案

如果您在相当现代的浏览器中运行,您可以通过创建一个隐藏 windowself 的函数来阻止 window 访问带有参数的变量,并以严格模式运行代码。

var obj = {};

var func = new Function("self", "window", "'use strict';" + code);

func.call(obj, obj, obj);

console.log(obj); // see if there were any attempts to set global variables.

任何访问 windowself 的尝试都只会访问我们的 obj 对象,以及 this 的值也将是我们的 obj

因为我们处于严格模式,所以不允许使用隐式全局变量。此外,函数的默认 this 值将是 undefined 而不是 window

我认为有一些技巧可以解决这个问题,但这应该涵盖大多数情况。

关于JavaScript - 如何从 eval 脚本中隐藏全局范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16823391/

相关文章:

javascript - CSS Hover 被停用

javascript - 在浏览器扩展中获取 DOM 值

javascript - 变量未填充所需值

java - 需要传递变量和标记 JPanel 的帮助

c++ - 在声明时对全局变量进行值初始化

angularjs - 在angularjs中检测页面卸载

python - 在 Python 3.X 中从 HTTP 响应中获取和评估 Python 代码

javascript - 如何从网页获取源代码?

javascript - 保护 JavaScript eval 函数

javascript - 在 JavaScript 或 NodeJS 中使用 eval 作为原型(prototype)方法名