假设我在javascript中执行此操作
delete window.alert;
// returns true
然后console.log(window.alert);
的输出将为"undefined"
代码必须有办法访问最初仍在window.alert
的原生Functoin,对吗?
我将如何解决取消删除并恢复window.alert。
显然,window.alert
只是全局对象的所有属性的占位符。
澄清:我没有“丢失”window.alert,而是我希望它丢失(例如,使其不可用于不太受信任的代码,然后不应该访问window.alert
。我会假设有一些方法可以恢复deleted
功能,我想知道如何“撤消”删除全局对象的属性?)
答案 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
对象的已删除属性。
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功能