使用iframe src覆盖alert()

时间:2016-03-02 07:30:52

标签: javascript iframe override

以下是示例代码:

HTML

<script> alert('This is alert!') </script>

JS

window.alert = function(data)  //alert() over-riding
{
     console.log("Alert over-ridden");
}

问题:

HTML

<iframe src=javascript:alert('Iframealert')>

JS

window.alert = function(data)  //alert() over-riding
{
   console.log("Alert over-ridden"); //This doesn't execute - I mean, this over-ride function is not called when the above iframe alert is executed
}

我知道另一个文档中的iframe不适用于父级覆盖(由于相同的域策略),但是,src JS只在父级中执行。

那么,我如何覆盖适用于上述iframe标记的alert()?

更新1:

HTML代码是静态的,我无法对其进行任何修改。我只能编写一些JS并附加到HTML。

有没有办法覆盖嵌套浏览窗口的alert()?

1 个答案:

答案 0 :(得分:3)

好问题!答案首先要看一下评估src属性时会发生什么的规则。

发生这种情况时,规范遵循number of steps during navigation。我们最终得到了第14步,它与javascript:计划有关。

在该步骤中,有一系列子步骤,其中一个是:

  

创建脚本,使用脚本源作为脚本源,地址作为脚本源URL,JavaScript作为脚本语言,以及{的脚本设置对象{1}}导航浏览上下文的活动文档的对象。

这里重要的是&#34;导航浏览上下文的活动文档的Window对象&#34; 。由于您正在导航Window,因此您实际上正在处理嵌套浏览上下文,它拥有自己的<iframe>,因此拥有被覆盖的父window没有任何区别。

但是,您可以覆盖内部窗口的window.alert

alert

这仅适用于document.getElementById('myIframe').contentWindow.alert = function(msg) { console.log('Overridden iframe: ' + msg); } 属性的javascript:方案网址,因为在此代码执行时我们只是尝试获取页面的地址以导航{{1 }} 至。实际导航时,会在导航步骤的第23步中创建一个包含其自身src的新Document对象,此时您将丢失被覆盖的<iframe>

这还依赖于在中覆盖window之后使用JavaScript 设置alert属性,您无法使用内联{{1元素的属性,因为元素需要在页面中以获取它并且它src,并且将它放在页面中意味着alert将被评估。< / p>

Here's a fiddle演示了src contentWindow属性中src的覆盖。