以下是示例代码:
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()?
答案 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>
。
这还依赖于在中覆盖 Here's a fiddle演示了window
之后使用JavaScript 设置alert
属性,您无法使用内联{{1元素的属性,因为元素需要在页面中以获取它并且它src
,并且将它放在页面中意味着alert
将被评估。< / p>
src
contentWindow
属性中src
的覆盖。