JavaScript – 如何从eval’d脚本隐藏全局范围

前端之家收集整理的这篇文章主要介绍了JavaScript – 如何从eval’d脚本隐藏全局范围前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我通常认为全局范围是一个总是可以从任何地方访问的命名空间.我想知道理论上是否有可能完全隐藏全球范围.例如,假设我们有一些我们想要评估的代码(在浏览器的控制台中):
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调用,可以从代码中隐藏此窗口和窗口:

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

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

解决方法

如果你在相当现代的浏览器中运行,你可以通过创建一个阴影窗口的函数和带参数的自变量来阻止窗口访问,并以严格模式运行代码.
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.

任何访问window或self的尝试都只会访问我们的obj对象,而这个值也将是我们的obj.

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

我认为有一些黑客可能会解决这个问题,但这应该涵盖大多数情况.

原文链接:https://www.f2er.com/js/155554.html

猜你在找的JavaScript相关文章