【问题标题】:How to get the original native browser objects, if they have changed?如果它们已更改,如何获取原始的本机浏览器对象?
【发布时间】:2014-10-10 21:55:26
【问题描述】:

其实整个问题。一种反猴子补丁。如何获取原始对象(对象、数组、函数、字符串等)及其原型,如果它们已更改\扩展\删除?

我现在看到的唯一选项 - 它是框架的动态创建 - 拉出他的原生对象 - 动态移除框架。在 Web Workers 的帮助下,也许同样可以做到。但是它们ie> 9,其中没有类DOM,并且本身与动态框架相同。

框架示例

delete Object.prototype.constructor;
delete Object;

console.log(window.__proto__.__proto__.__proto__.constructor); // undefined
// console.log(Object); // undefined

var frame = document.createElement('frame');
document.all[0].appendChild(frame);

var Object = frames[0].Object;
document.all[0].removeChild(frame);
console.log(Object);

这个理论问题。 例如,我们正在开发一个嵌入式库,并且不知道它什么时候会被调用,所以当它被调用时,原生浏览器对象可以被改变。我们需要什么来获取原始对象,初始环境。

也许还有其他方法可以解决?

提前致谢。

【问题讨论】:

  • 不是,不是。我说如果用户愚蠢到添加执行此操作的脚本,那是他们的问题。当然,其中一些可以从剩余的函数中检索到,而另一些则不能。

标签: javascript prototype monkeypatching


【解决方案1】:

在发布我的答案之前,我必须告诉你,我不会说英语,所以请原谅我的正字法,我没有解决你问题的方法,但也许这对你有帮助。

我一直在寻找如何获得 toString 内置函数,即使它被重新定义并且没有找到任何东西(除了创建一个新框架,但这个解决方案对我不起作用,因为我使用的是节点js/node webkit)。

我开始在窗口对象中搜索不可配置的对象,因此没有人可以重新定义它们,我发现了这个:

Object.getOwnPropertyDescriptor(window, "top");
//Object {value: Window, writable: true, enumerable: true, configurable: false}
Object.getOwnPropertyDescriptor(top.__proto__, "toString");
//Object {value: function, writable: true, enumerable: false, configurable: false}

所以如果我访问 top.__proto__.toString 总是得到真正的内置函数,因为它是不可配置的(到目前为止我还没有找到替换它的方法)。这在 webkit 客户端上为我工作,所以我必须继续寻找 nodejs 的解决方案。

顺便说一句,我和你一样删除了对象构造函数,我在顶部找不到Object,但我认为它必须存储在某个地方。我会继续搜索,如果我找到解决方案,我会编辑这篇文章。

我希望我有所帮助。

【讨论】:

  • 属性是可写的这一事实意味着人们可以简单地用一个邪恶的双胞胎替换整个属性:即。 top=sudoTop 或 top.__proto__.toString=sudoToString
猜你喜欢
  • 2021-10-19
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2010-10-23
  • 2021-04-28
  • 2011-04-08
  • 2021-03-19
相关资源
最近更新 更多