假设我删除了window.alert,我该如何取回它?

时间:2018-01-01 15:15:01

标签: javascript

假设我在javascript中执行此操作

delete window.alert;
// returns true

然后console.log(window.alert);的输出将为"undefined"

代码必须有办法访问最初仍在window.alert的原生Functoin,对吗? 我将如何解决取消删除并恢复window.alert。

显然,window.alert只是全局对象的所有属性的占位符。

澄清:我没有“丢失”window.alert,而是我希望它丢失(例如,使其不可用于不太受信任的代码,然后不应该访问window.alert。我会假设有一些方法可以恢复deleted功能,我想知道如何“撤消”删除全局对象的属性?)

3 个答案:

答案 0 :(得分:1)

window对象是普通的JavaScript对象。您可以通过保留alert函数来简单地“保存”它。

const alert = window.alert;
delete window.alert; // window.alert is now undefined
window.alert = alert;

答案 1 :(得分:1)

  

你如何取消删除' window.alert?

您需要保存该功能的参考:

var windowAlertBackup = window.alert;

然后:

window.alert = windowAlertBackup;
  

实际发生了什么?

任何本机窗口函数实际上都是由javascript解释器实现的。在javascript中,window.alert是指向该本机函数的指针。 window.alert是本机window.alert代码的唯一默认引用。

答案 2 :(得分:1)

即使其他答案引起了这样的印象:“没有找回javascript中已删除的窗口对象”,关于我的问题是Table_Addresses的功能,实际上有一种事先备份/复制,以获取全局L24 2SA对象的已删除属性。

通过将iframe注入DOM来获取“原始”窗口

window.alert消失了window时,我们可以通过创建另一个窗口或更准确地window.alert通过注入到DOM中的iframe来退回。

window

影响和后果

作为一种细粒度的禁用对某些Javascript和DOM功能的访问的方式,看起来似乎很有趣,它只是删除/覆盖那些属性。 contentWindow// step 1 "delete window.alert and check its gone, no backupcopy" console.log(typeof window.alert); // "function" delete window.alert; console.log(typeof window.alert); // "undefined" try{ window.alert(1); } catch(e){console.log(e);} // TypeError: "window.alert is not a function" // step 2 "insert an iframe into DOM, to take window.alert from its contentWindow" var iframe = document.createElement("iframe"); document.body.appendChild(iframe); window.alert = iframe.contentWindow.alert; console.log(typeof window.alert); // "function" 的某种形式。 这个吸引人的想法也是我提出这个问题的动机。现在看来,除非我们阻止漏洞通过"prevent scripts from showing an alert popup"重新获得window.alert=function(){}的“原始”动机,否则似乎很难做到这一点。

“通过iframe取消删除”技巧基于https://getfastvpn.com/webrtc-leak-test.html,该技巧应用了iframe-regain技巧来防止通过浏览器插件“天真”删除webrtc功能