如何防止 IFRAME 重定向顶级窗口

一些网站有“突破”IFRAME封装的代码,这意味着如果一个页面 A作为一个 IFRAME在父页面 P中加载,一些在 A中的 Javascript 会将外部窗口重定向到 A

通常这个 Javascript 看起来像这样:

<script type="text/javascript">
if (top.location.href != self.location.href)
top.location.href = self.location.href;
</script>

我的问题是: 作为父页 P的作者,而不是内页 A的作者,我如何防止 A发生这种突变?

另外,在我看来,这应该是一起跨站安全违规事件,但事实并非如此。

234624 次浏览

通过这样做,您将能够控制框架页的任何动作,而您不能。 同域起源策略适用。

尝试使用 onbefore 卸载属性,该属性允许用户选择是否要导航离开页面。

例子: https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload

在 HTML5中你可以使用沙箱属性。请参阅下面 Pankrat 的回答。 Http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/

由于在 iframe 中加载的页面可以使用 setInterval 执行“ break out”代码,因此 onbefore unload 可能不太实用,因为它可能会让用户不知所措地问“您确定要离开吗?”?对话。

还有一个 iframe 安全属性,它只能在 IE 和 Opera 上使用

:(

在我的例子中,我希望用户访问内部页面,这样服务器将看到他们的 IP 作为一个访问者。如果我使用 php 代理技术,我认为内部页面会看到我的服务器 ip 作为一个访问者,所以它是不好的。我现在唯一的解决办法就是在卸货之前。 把这个放在你的页面上:

<script type="text/javascript">
window.onbeforeunload = function () {
return "This will end your session";
}
</script>

这在 Firefox 和即,这是我测试的。 你会发现使用 evt.return (随便什么)这样的东西的版本... 在 Firefox 中不起作用。

对于 HTML5,添加了 Iframe 沙盒属性。在写这篇 可以在 Chrome,Safari,Firefox 以及 IE 和 Opera 的最新版本上运行的时候,它几乎可以做你想做的事情:

<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>

如果要 允许顶级重定向,请指定 sandbox="allow-top-navigation"

我知道这是一个很长的时间,因为问题已经完成,但这里是我的改进版本,它将等待500毫秒的任何后续调用,只有当 iframe 加载。

<script type="text/javasript">
var prevent_bust = false ;
var from_loading_204 = false;
var frame_loading = false;
var prevent_bust_timer = 0;
var  primer = true;
window.onbeforeunload = function(event) {
prevent_bust = !from_loading_204 && frame_loading;
if(from_loading_204)from_loading_204 = false;
if(prevent_bust){
prevent_bust_timer=500;
}
}
function frameLoad(){
if(!primer){
from_loading_204 = true;
window.top.location = '/?204';
prevent_bust = false;
frame_loading = true;
prevent_bust_timer=1000;
}else{
primer = false;
}
}
setInterval(function() {
if (prevent_bust_timer>0) {
if(prevent_bust){
from_loading_204 = true;
window.top.location = '/?204';
prevent_bust = false;
}else if(prevent_bust_timer == 1){
frame_loading = false;
prevent_bust = false;
from_loading_204 = false;
prevent_bust_timer == 0;
}






}
prevent_bust_timer--;
if(prevent_bust_timer==-100) {
prevent_bust_timer = 0;
}
}, 1);
</script>

onload="frameLoad()"onreadystatechange="frameLoad();"必须添加到帧或 iframe。

在阅读了 W3.org 规范之后,我找到了沙盒属性。

您可以设置 sandbox="",防止 iframe 重定向。也就是说它也不会重定向 iframe。你会失去点击本质上。

例如: http://jsfiddle.net/ppkzS/1/
没有沙盒的示例: < a href = “ http://jsfiddle.net/ppkzS/”> http://jsfiddle.net/ppkzs/

我在 iframe元素上使用 sandbox属性:

  • 允许提交表单
  • allow-popups允许弹出
  • allow-pointer-lock允许指针锁定
  • allow-same-origin允许文档保持其原始状态
  • allow-scripts允许 JavaScript 执行,也允许自动触发特性
  • allow-top-navigation允许文档通过导航顶层窗口打破框架

顶部导航是您想要防止的,所以不要使用它,它将不被允许。任何遗漏的信息都会被屏蔽

前男友。

<iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>

尝试:

<iframe sandbox=" "></iframe>